gpt4 book ai didi

python - 我如何从线程中更新 Kivy 元素?

转载 作者:太空狗 更新时间:2023-10-29 19:26:36 24 4
gpt4 key购买 nike

我有一个套接字客户端,它在每次收到消息时调用 View() 类。我以这样的方式拆分了我的代码,以便此类可以简单地使用 print() 或我喜欢的任何其他显示方法。但是,Kivy 似乎并不喜欢这种方法。我已经为我的 View 扩展了 Kivy 的 BoxLayout 类,并且可以调用 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))

确实调用了消息函数并进行了打印,但界面没有更新。但是,当我按下按钮时,它会更新界面并打印。

我研究过使用 StringProperty 来修改按钮文本,但也没有成功。请注意,如果我正在做的事情完全不可行,我稍后会尝试以板的形式绘制一个由 width * height 按钮组成的整个界面。

非常感谢任何输入,这让我发疯。


编辑 1*我已经关注了一些评论并尝试了一些事情。我添加了一个 Clock 类,并让它从 View 安排一个 update() 方法。 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)

线程现在简单地分配文本属性,如 message() 中所示。周期性触发的 update() 方法也可以工作,分配随机文本。但是现在的问题是它无法设置文本。这不起作用:

def update(self, *args, **kwargs):
self.btn.text = self.text

我一定是在其他地方做错了,有什么建议吗?


编辑 2*我尝试调试的错误是 here .

最佳答案

由于您没有发布完整的工作示例,我只能猜测您在做什么。您似乎在线程上有一个事件(传入消息),并且您希望在发生这种情况时显示一些文本。您需要将 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)

如 inclement 所述,您可以使用 @mainthread 自动执行此“推送到主线程”装饰者:

@mainthread
def update(self, text):
self.btn.text = text

def message(self, message):
update(message)

这样,无论何时调用 update它将在主线程上执行。

关于python - 我如何从线程中更新 Kivy 元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33809219/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com