如何使用绑定动态更新 Kivy Label 的文本属性
Posted
技术标签:
【中文标题】如何使用绑定动态更新 Kivy Label 的文本属性【英文标题】:How to update the text attribute of Kivy Label dynamically using bind 【发布时间】:2020-03-25 20:22:48 【问题描述】:我的问题很简单直接。我正在尝试使用 Kivy 中的bind
函数动态更新小部件的属性。 有可能吗?以及如何?
概述:
下面的 sn-p 是一个基本的 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 如何处理动态小部件修改,因为我对他们还是新手。
谢谢
【问题讨论】:
bind
语句将event
绑定到method
。你想绑定什么event
,当event
发生时你想调用什么method
?
@JohnAnderson 哦!在这种情况下没有事件,我猜。我只想更新text
属性。
然后您只需将text
属性设置为您想要的任何值。例如,my_label.text='new text'
,但这仅适用于builld
方法,因为my_label
是该方法的本地方法。在其他地方,您需要引用Label
实例。因为在您的示例中,Label
是TestApp
显示的root
,您可以使用App.get_running_app().root.text='new text'
更改文本,或者如果您使用TestApp
的方法进行更改,则可能是@987654344 @.
多么幼稚的问题,多么好的答案!泰@JohnAnderson。您能否将其发布为答案,以便我标记它。
【参考方案1】:
您只需将文本属性设置为您想要的任何内容。例如,
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
并绑定到该属性。绑定方法是将Label
的text
属性设置为更改后的StringProperty
的代码。这都可以在Python
中完成,但更常见(也更容易)在kv
文件中完成:
ScreenManager:
myText: 'Abba'
Screen:
name: 'the_screen'
Label:
text: root.myText
myText: 'Abba'
行在ScreenManager
中创建了一个StringProperty
。 text: root.myText
行将初始的Label
text
设置为“Abba”,并为您安排上述绑定。因此,每当ScreenManager
的myText
属性发生更改时,Label
text
将自动更新为更改后的StringProperty
。
【讨论】:
以上是关于如何使用绑定动态更新 Kivy Label 的文本属性的主要内容,如果未能解决你的问题,请参考以下文章
在 Kivy 上双击时如何回调和打印 MDLabel 的文本?