何时绑定到使用 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)
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)