我的问题很简单明了。我正在尝试使用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如何处理动态小部件修改,因为我还是新手。
谢谢
答案 0 :(得分:1)
您只需将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
的{{1}}属性设置为更改后的Label
的代码。这都可以在StringProperty
中完成,但是更常见(更容易)在Python
文件中完成:
kv
ScreenManager:
myText: 'Abba'
Screen:
name: 'the_screen'
Label:
text: root.myText
行在myText: 'Abba'
中创建一个StringProperty
。 ScreenManager
行将初始text: root.myText
Label
设置为“ Abba”,并为您安排上述绑定。因此,只要更改text
的{{1}}属性,myText
ScreenManager
就会自动更新为更改后的Label
。