我的问题很简单明了。我正在尝试使用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_press
,on_press
等)。但是,我找不到针对特定问题的答案。我希望有人会引导我找到正确的答案,也许因为我仍然不熟悉Kivy / Python如何处理动态小部件修改,所以请他们谈谈。
谢谢
您只需将text属性设置为所需的任何内容。例如,
my_label.text='new text'
但是仅在build方法中有效,因为my_label
在该方法本地。在其他地方,您将需要引用Label
实例。由于在您的示例中,Label
是TestApp
显示的根,因此可以使用
App.get_running_app().root.text='new text'
或者如果您以TestApp
的方法进行操作,则可能是
self.root.text='new text'
您还可以使用绑定,通常通过创建StringProperty
并绑定到该属性来使用。绑定方法将是将text
的Label
属性设置为更改的StringProperty
的代码。所有这些都可以在Python
中完成,但是更经常(更容易)在kv
文件中完成:
ScreenManager:
myText: 'Abba'
Screen:
name: 'the_screen'
Label:
text: root.myText
myText: 'Abba'
行在StringProperty
中创建一个ScreenManager
。 text: root.myText
行将初始Label
text
设置为“ Abba”,并为您安排上述绑定。因此,无论何时更改myText
的ScreenManager
属性,Label
text
都会自动更新为更改后的StringProperty
。