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

When to bind to attributes that populated with kv-file?

test.kv

<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__ (1) 中直接将某些东西绑定到 self.test,我会得到 AttributeError,因为 kv规则尚未应用 self.test is None。可能的解决方法是在第一次事件循环迭代后绑定到属性 (2)。

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

我知道其他 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

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

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

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

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