Kivy: 自我更新标签文本

0 投票
1 回答
5106 浏览
提问于 2025-04-18 07:20

假设我有三个类:一个是“工作类”,里面有一些事情在进行;一个是标签类,用来显示信息;还有一个类用来把这两个类放在一起。
比如,标签类可以是一个状态栏,用来显示工作类中某个事情的状态。我希望能找到一种方法,让这个标签自动更新显示的值,因为这个值是工作类中某个正在变化的值。

这里有一段示例代码:

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.customLabelvalue 属性也设置成相同的值。”

另外,你也可以直接在上面的 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

撰写回答