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

Flet桌面应用关闭触发事件并保存数据报错问题求助

Flet应用关闭时保存数据并正常退出的解决方案

你的问题核心在于设置page.window.prevent_close = True后,直接调用page.window.destroy()会重复触发窗口关闭事件,而os._exit(0)会绕过Flet的正常退出流程导致异常循环。

正确处理步骤

在完成数据保存后,先取消窗口关闭阻止,再执行销毁操作,避免重复触发关闭事件:

修改后的代码如下:

def on_close_event(e):
    if e.data == "close":
        # 保存未完成任务到JSON的逻辑
        un_tasks = dict()
        i = 0
        for tt in tab_download.tasks.controls:
            if type(tt.value) == str:
                un_tasks[i] = {"ttask": tt.ttask, "value": {"name": "", "path": ""}}
            else:
                un_tasks[i] = {"ttask": tt.ttask, "value": {"name": tt.value.name, "path": tt.value.path}}
            i += 1

        write_unfinished_tasks(un_tasks)
        
        # 先取消阻止窗口关闭,再销毁窗口
        page.window.prevent_close = False
        page.window.destroy()

page.window.prevent_close = True
page.window.on_event = on_close_event

原理说明

  • page.window.prevent_close = True会拦截所有窗口关闭请求,强制触发on_event回调
  • 如果直接调用destroy(),会再次触发关闭事件,导致回调重复执行,引发报错或循环
  • 先将prevent_close设为False,再调用destroy(),此时关闭操作不会被拦截,能正常退出应用

内容的提问来源于stack exchange,提问作者Łukasz Świątek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 14:58:13