kiy*_*yui 10 python python-multithreading kivy
我有一个套接字客户端,View()每次收到消息时都会调用一个类.我已经以这样的方式拆分我的代码,以便这个类可以简单地使用print()或任何其他显示方法,如我所愿.然而,似乎Kivy并不喜欢这种方法.我已经BoxLayout为我的观点扩展了Kivy的课程并且可以调用该message()函数.该类看起来像这样:
class View(BoxLayout):
def __init__(self, **kwargs):
super(View, self).__init__(**kwargs)
self.btn = Button(text='Default')
# Bind button press method
self.btn.bind(on_press=self.message)
self.add_widget(self.btn)
def message(self, message):
self.btn.text = 'Meow'
self.add_widget(Button(text='Meow'))
print(str(message))
Run Code Online (Sandbox Code Playgroud)
确实调用了消息函数并打印但接口未更新.然而,当我按下按钮时,它会更新界面以及打印.
我已经研究过使用a StringProperty来修改按钮文本但是也失败了.就像一张纸条,如果我正在做的事情是完全不可行的,我试图稍后绘制一个由width * height按钮组成的整个界面,以棋盘的形式.
任何输入都非常感激,这让我疯狂.
Clock类,让它安排一个update()方法View.update方法只是更改了一些元素的文本.我注意到它在我安排时有效,如下所示:
def update(self, *args, **kwargs):
self.btn.text = ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase) for i in range(32))
def message(self, message):
try:
print(message)
self.text = 'sending'
except Exception as e:
print(e)
Run Code Online (Sandbox Code Playgroud)
线程现在只是分配文本属性,如图所示message().定期触发的update()方法也有效,分配随机文本.现在问题是它无法设置文本.这不起作用:
def update(self, *args, **kwargs):
self.btn.text = self.text
Run Code Online (Sandbox Code Playgroud)
我一定在其他地方做错了,有什么建议吗?
由于您没有发布完整的工作示例,因此我只能猜测您在做什么。您似乎在某个线程上有一个事件(传入消息),并且您希望在发生这种情况时显示一些文本。您需要将 UI 更新“推送”到主线程,但您不需要使用 进行定期更新Clock,您只需使用 安排一次调用即可Clock.schedule_once。
from functools import partial
def update(self, text, *a):
self.btn.text = text
def message(self, message):
Clock.schedule_once(partial(self.update, message), 0)
Run Code Online (Sandbox Code Playgroud)
正如 inclement 所提到的,您可以使用@mainthread装饰器自动执行此“推送到主线程” :
@mainthread
def update(self, text):
self.btn.text = text
def message(self, message):
update(message)
Run Code Online (Sandbox Code Playgroud)
这样,无论何时调用update它都会在主线程上执行。