Kivy Python:手风琴中的手风琴,使用变量

时间:2016-10-13 14:34:37

标签: python kivy kivy-language

我正在尝试创建一个手风琴菜单(1号),其中还有另一个手风琴菜单(2号)。 手风琴2号的大小将由用户定义(结果的一个例子显示在该图像中)。 enter image description here

问题在于,虽然我已经设法创建了一个在用户输入后创建手风琴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)  

知道如何解决这个问题吗? 感谢

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将其放在那里。