Kivy: 自我更新标签文本
假设我有三个类:一个是“工作类”,里面有一些事情在进行;一个是标签类,用来显示信息;还有一个类用来把这两个类放在一起。
比如,标签类可以是一个状态栏,用来显示工作类中某个事情的状态。我希望能找到一种方法,让这个标签自动更新显示的值,因为这个值是工作类中某个正在变化的值。
这里有一段示例代码:
Builder.load_string('''
<CustomLabel>
text: 'Value is {}'.format(root.value)
<WorkingClass>:
orientation: 'vertical'
Button:
text: 'Update'
on_release: root.update()
<MainLayout>
orientation: 'vertical'
''')
class CustomLabel(Label):
value = NumericProperty()
class WorkingClass(BoxLayout):
def __init__(self, *args, **kwargs):
super(WorkingClass, self).__init__(*args, **kwargs)
self.a = 5
def update(self):
self.a += 1
print(self.a)
class MainLayout(BoxLayout):
def __init__(self, *args, **kwargs):
super(MainLayout, self).__init__(*args, **kwargs)
self.workingClass = WorkingClass()
self.customLabel = CustomLabel(value=self.workingClass.a)
self.add_widget(self.customLabel)
self.add_widget(self.workingClass)
class MyApp(App):
def build(self):
return MainLayout()
if __name__ == "__main__":
MyApp().run()
有没有什么方法可以用属性或者其他方式来实现这个?因为我不想每次改变值的时候都手动更新标签。有没有办法做到这一点?
1 个回答
2
你在更新 WorkingClass
的一个属性,但这并不会自动更新 CustomLabel
的值,因为你是直接赋值,而不是用 bind
绑定它。不过没关系,你可以使用 Property
来让一切自动运作。
在 WorkingClass
中:
class WorkingClass(BoxLayout):
a = NumericProperty()
def __init__(self, **kwargs): ...
这段代码把 a
变成了一个 Property
,这样你就可以绑定它了。
然后在 MainLayout
的构造函数中:
self.workingClass = WorkingClass()
self.customLabel = CustomLabel(value=self.workingClass.a)
self.workingClass.bind(a=self.customLabel.setter('value'))
最后一行的意思是:“当 self.workingClass
中的属性 a
的值发生变化时,把 self.customLabel
的 value
属性也设置成相同的值。”
另外,你也可以直接在上面的 WorkingClass
中添加 Property
,然后去掉 MainLayout
的构造函数,改用 kv 语言来实现:
<MainLayout>:
orientation: 'vertical'
WorkingClass:
id: working_class
CustomLabel:
value: working_class.a # assigning one property to another in kv automatically binds