我想在运行某些内容时更新kivy小部件的属性...
示例:
class app(App):
def build(self):
self.layout = Layout()
self.name = Label(text = "john")
self.layout.add_widget(self.name)
return self.layout
def update(self):
for i in range(50): #keep showing the update
self.name.text = str(i)
#maybe some sleep here
obj = app()
obj.run()
obj.update()
这只会告诉我循环的最终结果。我想在循环过程中不断更新label.text。
我找了类似bind(),setter()和ask_update()函数的东西,但如果是这些函数,我还没有得到如何使用它们。
------------------编辑-----------------------
尝试适应inclement
回答(使用Clock在其他线程中运行更新功能),我得到了下面的代码,试图按照我的问题的真实想法,但仍然无法正常工作:
class main():
def __init__(self, app):
self.app = app
... some code goes here ...
def func(self):
Clock.schedule_once(partial(self.app.update, self.arg_1, self.arg_2), 0)
class app(App):
def build(self):
self.main = main(self)
self.layout = Layout()
self.name = Label(text = "john")
self.layout.add_widget(self.name)
return self.layout
... some code goes here ...
def update(self, dt, arg_1, arg_2):
self.name = arg_1
sleep(5)
self.name = arg_2
obj = app()
obj.run()
当我在func
函数中订购文本更改时,我需要调用update
函数并使其更新标签文本。
答案 0 :(得分:2)
您需要避免阻止主线程。在大多数情况下,使用kivy的时钟很方便。您可以执行以下操作。
from kivy.clock import Clock
class app(App):
def build(self):
self.layout = Layout()
self.name = Label(text = "john")
self.layout.add_widget(self.name)
self.current_i = 0
Clock.schedule_interval(self.update, 1)
return self.layout
def update(self, *args):
self.name.text = str(self.current_i)
self.current_i += 1
if self.current_i >= 50:
Clock.unschedule(self.update)
答案 1 :(得分:0)
不确定是否还有人需要答案,但似乎你的错误就在这里:
def update(self, dt, arg_1, arg_2):
self.name = arg_1
sleep(5)
self.name = arg_2
您可以将arg1
和arg2
(可能是字符串)分配给窗口小部件,这似乎没有多大意义。或者创建一个新窗口小部件并将其重新分配给同一个变量,这也是不正确的。相反,您可以直接分配给属性:
def update(self, dt, arg_1, arg_2):
self.name.text = arg_1
sleep(5)
self.name.text = arg_2
或者您可以在主对象上创建StringProperty并将self.name.text
绑定到它,但我个人更喜欢手动更新屏幕。显式优于隐式和所有。