2017-07-17 86 views
0

我想在python代碼中訪問AccordionItem的title屬性,這是在kv文件中設置的。該屬性爲空字符串,即使它在GUI中正確顯示。AccordionItem title屬性是空的,即使它在kv文件中設置?

有沒有辦法訪問這個屬性的值,或者我在這裏丟失了什麼?

千伏文件

<TableModifications>: 
    accordion: accordion 
    MDAccordion: 
     id: accordion 
     orientation: 'vertical' 
     size_hint_x: None 
     width: '240dp' 
     TableAccordionItem: 
      title:'Add' # I want to access this in python code 
      icon: 'plus' 
     TableAccordionItem: 
      title:'Edit' 
      icon: 'pencil' 
     TableAccordionItem: 
      title:'Remove' 
      icon: 'delete' 

Python代碼

class TableModifications(BoxLayout): 
    pass 


class TableAccordionItem(MDAccordionItem): 

    def __init__(self, **kwargs): 
     super(TableAccordionItem, self).__init__(**kwargs) 
     print(self.title) # this is empty, why? 

    def add_widget(self, widget, *args): 
     super(TableAccordionItem, self).add_widget(widget, *args) 
     print(self.title) # this is empty, why? 
+0

如果下面的答案是正確的,請接受的答案。謝謝。 – Mox

回答

0

您需要使用kivy的ObjectProperty將神奇綁定到你千伏小部件。另外,如果一個小部件已經以kv lang添加到了你的小部件樹中,那麼你不需要在python中再次添加該小部件。 add_widget不是您需要覆蓋的方法。如果你想添加一個小部件,你可以這樣做:self.add_widget(Label(text="Hello"))

例子:

from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.label import Label 
from kivy.properties import ObjectProperty 
from kivy.app import App 
from kivy.lang import Builder 

Builder.load_string(""" 
<RootWidget>: 
    accord_1: accord_1 
    accord_2: accord_2 
    accord_3: accord_3 
    Accordion: 
     orientation: "vertical" 
     AccordionItem: 
      id: accord_1 
      title: "Title 1" 
      Label: 
       text: "Accordion One Content." 
     AccordionItem: 
      id: accord_2 
      title: "Title 2" 
      Label: 
       text: "Accordion Two Content." 
     AccordionItem: 
      id: accord_3 
      title: "Title 3" 
""") 


class RootWidget(BoxLayout): 

    accord_1 = ObjectProperty(None) 
    accord_2 = ObjectProperty(None) 
    accord_3 = ObjectProperty(None) 

    def __init__(self, *args, **kwargs): 
     super(RootWidget, self).__init__(*args, **kwargs) 

     self.accord_3.add_widget(Label(text="Accordion Three Content.")) 

     for ac in [self.accord_1, self.accord_2, self.accord_3]: 
      print ac.title 


class TestApp(App): 
    def build(self): 
     return RootWidget() 


if __name__ == '__main__': 
    TestApp().run() 
相關問題