2017-07-17 6 views
0

私はAccordionItemのtitleプロパティに、kvファイルで設定されているPythonコードでアクセスしようとしています。 GUIに正しく表示されていても、このプロパティは空の文字列です。kvファイルに設定されていても、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

あなたは魔法のようにあなたのKV内のウィジェットに結合すること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() 
関連する問題