我正在尝试创建一个手风琴菜单(1号),其中还有另一个手风琴菜单(2号)。 手风琴2号的大小将由用户定义(结果的一个例子显示在该图像中)。
问题在于,虽然我已经设法创建了一个在用户输入后创建手风琴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)
知道如何解决这个问题吗? 感谢
答案 0 :(得分:1)
由于您在Accordion
的{{1}} / addFloor
中将calc
的实例返回到任何内容,因此无法显示。要创建小部件,您必须调用on_text_validate
,所以让我们这样做:
<parent>.add_widget(<widget>)
那么你的on_text_validate: root.add_widget(root.addFloor(NumOfStories.text))
现在是一个类方法,你需要使用calc()
作为附加参数(并且更加混乱),或者使用self
装饰器,它使@staticmethod
没有类的东西,让你以这种方式使用它calc()
Class.method(...)
之后会出现一个新的@staticmethod
def calc(val):
,但是尺寸和位置由您决定。此外,默认情况下,该窗口小部件可能没有背景,因此您最终会通过canvas instructions将其放在那里。