测试.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)