You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 03:55:30