【发布时间】:2016-02-21 21:50:25
【问题描述】:
我有一个套接字客户端,它每次收到消息时都会调用View() 类。我已经以这样一种方式拆分了我的代码,这样这个类就可以简单地使用print() 或任何其他我喜欢的显示方法。然而,Kivy 似乎并不喜欢这种方法。我已经为我的视图扩展了 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))
message 函数确实被调用并打印但界面没有更新。但是,当我按下按钮时,它会更新界面和打印。
我已经研究过使用StringProperty 来修改按钮文本,但也失败了。顺便说一句,如果我正在做的事情完全不可行,我稍后会尝试以板的形式绘制一个由width * height 按钮组成的整个界面。
非常感谢任何意见,这让我发疯了。
编辑 1* 我已经关注了一些 cmets 并尝试了一些事情。我添加了一个
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() 中所见的 text 属性。周期性触发的update() 方法也可以工作,分配随机文本。但是现在的问题是它无法设置文本。这不起作用:
def update(self, *args, **kwargs):
self.btn.text = self.text
我肯定在其他地方做错了,有什么建议吗?
编辑 2* 我要调试的错误是here。
【问题讨论】:
-
您不能从主线程以外的线程修改 UI 元素或属性。查看 Kivy
Clock类以调度函数在主线程上运行。 -
对于@bj0 的回答,您可以使用
@mainthread装饰器自动将此方法应用于函数。 -
嘿,我已经编辑了帖子并提供了进一步的发现。感谢您的帮助以及使用
Clock()的建议,但如上所述,它仍然没有完全发挥作用。
标签: python kivy python-multithreading