何时绑定到用kv文件填充的属性



测试.kv

<RootWidget>:
    test: test
    Label:
        id: test
        text: "some"

测试.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__(1(内直接将某些内容绑定到self.test,我将得到AttributeError,因为还没有应用kv规则和self.test is None。可能的解决方法是在第一次事件循环迭代后绑定到属性(2(。

这个解决方案似乎是胶带。有更好的方法吗?

我知道其他三种方法。

首先,使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

如果您有很多相同类型的小部件要绑定,这将非常有用。

第三,使用属性的on_x回调:

class RootWidget(Widget):
    test = ObjectProperty(None)
    def on_test(self, *args):
        print(self.test)

最新更新