如何在Beeware Toga主线程通过按钮启停thread_1中的my_function()
Beeware Toga线程函数启停控制及GUI阻塞问题处理
核心需求
在主线程运行的多按钮Beeware Toga应用中,通过按钮控制子线程thread_1内持续运行的my_function()的启停。
已解决的GUI阻塞问题
此前遇到my_function()运行时阻塞Toga GUI的问题,已定位为线程间时间竞争导致,在my_function()第一行添加time.sleep(0.1)即可解决。
线程启停控制的实现思路
1. 用线程安全的标志位控制循环
- 定义类成员或全局布尔变量(比如
is_running),作为my_function()循环运行的判断条件 - 在
my_function()中加入标志位检查:def my_function(self): time.sleep(0.1) # 解决GUI卡顿的关键代码 while self.is_running: # 执行你的业务逻辑 # 可添加短睡眠降低CPU占用 time.sleep(0.01) - 启动按钮点击事件:设置
is_running = True,创建并启动线程(线程只能启动一次,重启需重新创建对象)def on_start_click(self, widget): if not self.thread_1 or not self.thread_1.is_alive(): self.is_running = True self.thread_1 = threading.Thread(target=self.my_function) self.thread_1.start() - 停止按钮点击事件:设置
is_running = False,让线程自然退出def on_stop_click(self, widget): self.is_running = False # 可选:等待线程完全结束 if self.thread_1 and self.thread_1.is_alive(): self.thread_1.join()
2. 线程安全更新UI
- 子线程禁止直接修改Toga GUI控件,需用
app.add_background_task()实现线程安全的UI更新:def my_function(self): time.sleep(0.1) while self.is_running: # 业务逻辑处理 # 安全更新状态标签 self.app.add_background_task(lambda: self.status_label.text = "运行中") time.sleep(0.01)
3. 线程状态管理
- 保存线程对象引用,避免被垃圾回收;每次启动前检查线程是否存活,防止重复启动。
内容的提问来源于stack exchange,提问作者Ariel
相关产品推荐
相关产品推荐

