在Raspberry Pi上使用Kivy时,sleep期间UI无法更新的问题求助
嘿,我一眼就揪出问题所在啦!你线程创建的方式错了,导致蜂鸣逻辑还是在主线程里跑,UI自然会被阻塞~
看你写的这行代码:
threading.Thread(target=self.beep(3),daemon=True).start()
这里你直接调用了self.beep(3),这意味着beep函数会立刻在主线程执行完毕,线程还没真正启动呢!这就是为什么Label还是要等蜂鸣完才更新的原因。
正确的做法是这样的:
- 先把蜂鸣的逻辑封装成独立的方法(如果还没做的话):
def beep(self, repeat_times): for _ in range(repeat_times): BUZZ.on() time.sleep(0.4) BUZZ.off() time.sleep(0.2)
- 创建线程时,要把函数对象传给
target,参数用args传递(注意args是元组,即使只有一个参数也要加逗号):
# 重点:target传self.beep而不是self.beep(3),参数放args里 threading.Thread(target=self.beep, args=(3,), daemon=True).start() self.labelStatus.text = "Card NOT accepted!" Clock.schedule_once(self.returntomain,4)
这样修改后,蜂鸣的逻辑会在后台线程里独立执行,主线程可以马上更新Label的文本,不会被time.sleep阻塞啦!
另外再提个小提醒:如果之后你需要在子线程里更新Kivy的UI组件,一定要用Clock.schedule_once或者Clock.schedule_interval把UI操作调度到主线程执行,Kivy的UI操作必须在主线程完成哦~
内容的提问来源于stack exchange,提问作者Moon Walker
相关产品推荐
相关产品推荐

