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.

将其放置在那里