Kivy Python:手风琴内部的手风琴,使用变量
Kivy Python: Accordion inside an accordion, using a variable
我正在尝试创建一个手风琴菜单(第 1 号),其中有另一个手风琴菜单(第 2 号)。
手风琴 2 号的大小将由用户定义(结果示例如图所示)。
问题是,尽管我设法创建了一个 class 来根据用户输入创建手风琴 2 - 我似乎无法找到在屏幕上显示它的方法。
这是我的py代码:
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput
from kivy.uix.accordion import Accordion, AccordionItem
from kivy.properties import NumericProperty
wide = 0
long = 0
class AccordionClass():
def calc(val):
number = val
root = Accordion(size= (200,700), pos = (50,80), orientation= 'vertical')
for x in range(number):
print ('x = ',x)
item = AccordionItem(title='Title %d' % x)
item.add_widget(Label(text='Very big content\n' * 10))
root.add_widget(item)
print ('END')
return root
class LoginScreen(GridLayout):
numOfStories = NumericProperty()
def printTxt(self, text, TextInputId):
pass
def addFloor(self,text):
self.numOfStories = int(text)
print ('self.numOfStories = ', self.numOfStories)
rootAc = AccordionClass.calc(self.numOfStories)
return rootAc
pass
class screen2(App):
def build(self):
self.root = GridLayout()
return LoginScreen()
if __name__ == "__main__":
screen2().run()
和我的 kv 代码:
<TextInput>:
multiline: False
size:150,23
font_size: 12
padding: [5, ( self.height - self.line_height ) / 2]
<Label>:
size:120,18
font_size: 12
padding: [5, ( self.height - self.line_height ) / 2]
<LoginScreen>:
canvas:
Color:
rgb: (0.93, 0.93, 0.93,1)
Rectangle:
pos: self.pos
size: self.size
GridLayout:
size:root.size
cols:2
Accordion:
size_hint: (1.0,0.2)
orientation: 'vertical'
AccordionItem:
title: 'Plot'
GridLayout:
AccordionItem:
title: 'Number'
GridLayout:
Label:
text: "Number"
color: [0, 0, 0, 1]
pos:root.x, root.top-self.height-100
TextInput:
pos:root.x+120, root.top-self.height-100
id: NumOfStories
on_text_validate: root.addFloor(NumOfStories.text)
AccordionItem:
title: 'Another number'
Button:
background_color: (5,5,5,1)
知道如何解决这个问题吗?
谢谢
它没有显示是因为您在 on_text_validate
中的 addFloor
/calc
中将 Accordion
的实例返回到空。要创建小部件,您必须调用 <parent>.add_widget(<widget>)
,让我们这样做:
on_text_validate: root.add_widget(root.addFloor(NumOfStories.text))
那么你的 calc()
现在是一个 class 方法,你要么需要使用 self
作为附加参数(并且有更多的混乱),要么使用@staticmethod
装饰器,它使 calc()
没有 class 东西,并让你这样使用它 Class.method(...)
@staticmethod
def calc(val):
之后会出现一个新的 Accordion
,但大小和位置由您决定。此外,默认情况下该小部件可能没有背景,因此您最终会通过 canvas instructions.
将其放置在那里
我正在尝试创建一个手风琴菜单(第 1 号),其中有另一个手风琴菜单(第 2 号)。
手风琴 2 号的大小将由用户定义(结果示例如图所示)。
问题是,尽管我设法创建了一个 class 来根据用户输入创建手风琴 2 - 我似乎无法找到在屏幕上显示它的方法。
这是我的py代码:
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput
from kivy.uix.accordion import Accordion, AccordionItem
from kivy.properties import NumericProperty
wide = 0
long = 0
class AccordionClass():
def calc(val):
number = val
root = Accordion(size= (200,700), pos = (50,80), orientation= 'vertical')
for x in range(number):
print ('x = ',x)
item = AccordionItem(title='Title %d' % x)
item.add_widget(Label(text='Very big content\n' * 10))
root.add_widget(item)
print ('END')
return root
class LoginScreen(GridLayout):
numOfStories = NumericProperty()
def printTxt(self, text, TextInputId):
pass
def addFloor(self,text):
self.numOfStories = int(text)
print ('self.numOfStories = ', self.numOfStories)
rootAc = AccordionClass.calc(self.numOfStories)
return rootAc
pass
class screen2(App):
def build(self):
self.root = GridLayout()
return LoginScreen()
if __name__ == "__main__":
screen2().run()
和我的 kv 代码:
<TextInput>:
multiline: False
size:150,23
font_size: 12
padding: [5, ( self.height - self.line_height ) / 2]
<Label>:
size:120,18
font_size: 12
padding: [5, ( self.height - self.line_height ) / 2]
<LoginScreen>:
canvas:
Color:
rgb: (0.93, 0.93, 0.93,1)
Rectangle:
pos: self.pos
size: self.size
GridLayout:
size:root.size
cols:2
Accordion:
size_hint: (1.0,0.2)
orientation: 'vertical'
AccordionItem:
title: 'Plot'
GridLayout:
AccordionItem:
title: 'Number'
GridLayout:
Label:
text: "Number"
color: [0, 0, 0, 1]
pos:root.x, root.top-self.height-100
TextInput:
pos:root.x+120, root.top-self.height-100
id: NumOfStories
on_text_validate: root.addFloor(NumOfStories.text)
AccordionItem:
title: 'Another number'
Button:
background_color: (5,5,5,1)
知道如何解决这个问题吗? 谢谢
它没有显示是因为您在 on_text_validate
中的 addFloor
/calc
中将 Accordion
的实例返回到空。要创建小部件,您必须调用 <parent>.add_widget(<widget>)
,让我们这样做:
on_text_validate: root.add_widget(root.addFloor(NumOfStories.text))
那么你的 calc()
现在是一个 class 方法,你要么需要使用 self
作为附加参数(并且有更多的混乱),要么使用@staticmethod
装饰器,它使 calc()
没有 class 东西,并让你这样使用它 Class.method(...)
@staticmethod
def calc(val):
之后会出现一个新的 Accordion
,但大小和位置由您决定。此外,默认情况下该小部件可能没有背景,因此您最终会通过 canvas instructions.