2016-10-24 1 views
0

test.kvkv-fileで設定された属性にバインドするのはいつですか?

<RootWidget>: 
    test: test 

    Label: 
     id: test 
     text: "some" 

test.py

class RootWidget(Widget): 
    test = ObjectProperty(None) 

    def __init__(self, **kwargs): 
     # 1: 
     print(self.test) # None 

     # 2: 
     def after_tick(*args): 
      print(self.test) # Label object 
     Clock.schedule_once(after_tick, 0) 

     super().__init__() 

私が直接__init__()内self.testに何かをバインドしよう場合、私は以来、AttributeErrorになるだろうkvルールはまだ適用されておらず、self.test is Noneです。考えられる回避策は、最初のイベントループ反復()のあとに属性にバインドすることです。

この溶液はダクトテープのようです。もっと良い方法はありますか?

答えて

1

私は他の3つの方法を知っています。

まず、after_tick方法を作るし、initでそれを実行します。

class RootWidget(Widget): 
    test = ObjectProperty(None) 

    def __init__(self, **kwargs): 
     super().__init__(**kwargs) 
     self.delayed_init() 

    @mainthread 
    def delayed_init(self): 
     print(self.text) 

第二に、常に最初のループフレームの後に実行される組み込みメソッドを使用します。

class RootWidget(Widget): 
    test = ObjectProperty(None) 

    def add_widget(self, widget, index=0): 
     super().add_widget(widget, index) 

     if widget.__class__.__name__ == 'Label': 
      widget.text = self.test.text 

これをバインドする同じタイプのウィジェットがたくさんある場合に便利です。

class RootWidget(Widget): 
    test = ObjectProperty(None) 

    def on_test(self, *args): 
     print(self.test) 

第三に、プロパティのon_xコールバックを使用します

関連する問題