基于Flet框架的Python异步While循环卡在await asyncio.sleep(1)
Flet异步任务停滞问题解决:实现非阻塞的定时GUI数值递增
问题根源
- 直接在Flet的同步
main函数里调用asyncio.run()会阻塞UI主线程,导致await asyncio.sleep(1)后任务彻底停滞,因为主线程被占用无法处理后续异步事件。 - 代码中存在未定义变量
norion_token,实际应该使用number_int。 - 递归调用
countdown和auto_inc的方式存在隐患,长期运行可能引发栈溢出。 - 初始设置的20秒倒计时不符合你每10分钟递增的需求。
修正后的完整代码
import flet from flet import Page, Theme, Text, Column import asyncio def main(page: Page): theme = Theme() page.vertical_alignment = "center" number_to_inc = Text(value="0.00000000", width=170) number_int = 0.00000000 # 10分钟 = 600秒 INTERVAL = 600 async def auto_inc_loop(): nonlocal number_int while True: # 等待10分钟 await asyncio.sleep(INTERVAL) # 递增数值 number_int += 0.00000001 formatted_value = "{:.8f}".format(number_int) number_to_inc.value = f"{formatted_value} Here it is" print("数值已更新") # 更新UI page.update() def add_widgets(): page.add(Column([number_to_inc])) # 用Flet的run_task启动异步任务,不阻塞UI page.run_task(auto_inc_loop) # 根据平台添加组件 if page.web: add_widgets() print("WEBROWSER") elif page.platform == "windows": add_widgets() print(page.platform) elif page.platform == "android": add_widgets() print(page.platform) flet.app(target=main)
关键改动说明
- 用
page.run_task()替代asyncio.run():Flet内置的这个方法会把异步任务托管到自身的事件循环中,不会阻塞UI主线程,确保异步任务和UI交互能同时进行。 - 重构为无限循环逻辑:去掉递归调用,改用
while True+await asyncio.sleep(INTERVAL)实现定时递增,逻辑更清晰且避免栈溢出风险。 - 修复变量名错误:将未定义的
norion_token替换为正确的number_int。 - 补充
add_widgets函数:确保显示数值的Text组件被添加到页面,否则GUI上看不到更新的内容。 - 设置正确的间隔时间:把倒计时改为10分钟(600秒),符合你的需求。
内容的提问来源于stack exchange,提问作者Applicator Developer
相关产品推荐
相关产品推荐

