Kivy:自我更新的标签文字

时间:2014-05-22 21:43:34

标签: python kivy

我们说我有三个班级:一个" 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)标签。无论如何要实现这个目标?

1 个答案:

答案 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