如何使用绑定动态更新Kivy Label的text属性

时间:2019-11-30 16:55:31

标签: python dynamic label kivy kivy-language

我的问题很简单明了。我正在尝试使用Kivy中的bind函数动态更新小部件的属性。 有可能吗?以及如何?

概述

以下代码段是一个基本的Kivy应用程序,它向屏幕上添加了一个Label小部件和一些文本。有用!但是,如果我想使用bind动态更改文本(如注释行所示),则会收到以下错误消息:

AssertionError: 'Updated Text' is not callable

from kivy.app import App
from kivy.uix.label import Label


class TestApp(App):
    def build(self):
        my_label = Label(text='Initial Text')
        # my_label.bind(text='Updated Text')
        return my_label


if __name__ == '__main__':
    TestApp().run()

PS: 我已经看过所有相关问题,并在网上做了很多研究,包括使用可调用属性的回调(即on_presson_press等)。但是,我找不到针对特定问题的答案。 我希望有人会引导我找到正确的答案,也许还可以谈谈Kivy / Python如何处理动态小部件修改,因为我还是新手。

谢谢

1 个答案:

答案 0 :(得分:1)

您只需将text属性设置为所需的任何内容即可。例如,

my_label.text='new text'

但这仅在build方法中有效,因为my_label在该方法本地。在其他地方,您将需要引用Label实例。由于在您的示例中,LabelTestApp显示的根,因此您可以使用来更改文本

App.get_running_app().root.text='new text'

或者如果您使用TestApp方法进行操作,则可能是

self.root.text='new text'

您还可以使用绑定,通常是通过创建StringProperty并绑定到该属性来进行。绑定方法将是将text的{​​{1}}属性设置为更改后的Label的代码。这都可以在StringProperty中完成,但是更常见(更容易)在Python文件中完成:

kv

ScreenManager: myText: 'Abba' Screen: name: 'the_screen' Label: text: root.myText 行在myText: 'Abba'中创建一个StringPropertyScreenManager行将初始text: root.myText Label设置为“ Abba”,并为您安排上述绑定。因此,只要更改text的{​​{1}}属性,myText ScreenManager就会自动更新为更改后的Label