我有一个socket客户端,每次收到消息时都会调用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))
消息函数确实被调用并打印了,但界面没有更新。但我按下按钮后,它会更新界面并打印。我尝试使用 StringProperty
修改按钮文本,但也失败了。只是提醒一下,如果我所做的完全不可行,我正试图稍后绘制一个由 width * height
个按钮组成的整个界面,呈现为一个棋盘。
非常感谢任何输入,这让我发疯了。
编辑1*我跟随一些评论并尝试了一些事情。我添加了一个
Clock
类,并安排它从 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)
现在该线程只需像中所示一样分配文本属性。定期触发的update()
方法也可以工作,分配随机文本。然而问题是它无法设置文本。下面是无效的:
def update(self, *args, **kwargs):
self.btn.text = self.text
我肯定是在其他地方做错了,有什么建议吗?
EDIT 2* 我要调试的错误在这里。
Clock
类,以在主线程上调度函数运行。 - bj0@mainthread
装饰器自动将此方法应用于函数。 - inclementClock()
的建议,但正如上面提到的,它仍然没有完全功能。 - kiyui