我们说我有三个班级:一个" woking class"发生内容的地方,标签类和包含它们的类。 例如,标签类可以是状态栏,显示工作类上发生的事情的状态。我希望我能找到一种方法让标签自我更新要显示的值,因为这个值是后者内部工作类的值。
这里我有一个示例代码
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()
有没有办法用属性或其他方法做到这一点?我不想每次更改值时都需要手动更新(sommehow)标签。无论如何要实现这个目标?
答案 0 :(得分: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'))
的构造函数中:
a
最后一行说:&#34;当self.workingClass
上的属性value
的值发生变化时,将self.customLabel
的{{1}}属性设置为相同的值&#34 ;
或者,您可以将上面的Property
添加到WorkingClass
,然后摆脱MainLayout
的构造函数并改用kv:
<MainLayout>:
orientation: 'vertical'
WorkingClass:
id: working_class
CustomLabel:
value: working_class.a # assigning one property to another in kv automatically binds