如何在 Flet 应用中实现重启后数据持久化(Python 教程)
发布于2026-07-17 阅读(0)
日常用Flet写点小工具的时候,最烦人的莫过于:你辛辛苦苦加了一堆待办事项,关上窗口再打开,全没了。这不是Flet的锅——它默认所有数据都活在内存里,程序一退,内存释放,一切归零。但要解决这个问题,其实也没那么复杂。完全不需要引入什么用户系统、后端数据库,甚至不用注册登录。对于想快速落地的初学者来说,用本地文件持久化,是最直接也最靠谱的入门方案。
说到最省心的方案,我首推JSON文件。结构清晰,Python自带json模块,不需要额外装包,天然适配字典和列表。以后想扩展字段——比如加个截止时间、完成状态、多用户支持——直接在JSON结构里加键值对就行,非常灵活。
下面是一份完整的可运行示例,基于Flet 0.27+,拿来就能用:
```python
import flet as ft
import json
import os
# 定义数据文件路径
DATA_FILE = "tasks.json"
# 初始化数据:从文件读取,若不存在则创建空列表
def load_tasks():
if os.path.exists(DATA_FILE):
try:
with open(DATA_FILE, "r", encoding="utf-8") as f:
return json.load(f)
except (json.JSONDecodeError, OSError):
return []
return []
# 保存任务列表到文件
def sa ve_tasks(tasks):
try:
with open(DATA_FILE, "w", encoding="utf-8") as f:
json.dump(tasks, f, ensure_ascii=False, indent=2)
except OSError as e:
print(f"⚠️ 保存失败:{e}")
def main(page: ft.Page):
page.title = "持久化待办清单"
page.padding = 20
# 加载已有任务
tasks = load_tasks()
# UI 控件
task_input = ft.TextField(hint_text="输入新任务...", expand=True)
task_list = ft.Column(scroll="auto", height=300)
# 渲染任务列表
def update_task_list():
task_list.controls.clear()
for i, task in enumerate(tasks):
cb = ft.Checkbox(label=task, value=False)
task_list.controls.append(cb)
page.update()
# 添加任务
def add_task(e):
if task_input.value.strip():
tasks.append(task_input.value.strip())
sa ve_tasks(tasks) # ✅ 关键:立即写入磁盘
task_input.value = ""
update_task_list()
# 页面布局
page.add(
ft.Text("? 我的待办清单", size=24, weight="bold"),
ft.Row([task_input, ft.ElevatedButton("添加", on_click=add_task)]),
ft.Divider(),
task_list
)
# 首次加载显示任务
update_task_list()
ft.app(target=main)
```
### ⚠️ 注意事项与最佳实践
- **自动保存优于定时保存**:每次增删改操作后立即调用 sa ve_tasks(),避免意外崩溃导致数据丢失。
- **异常防御**:load_tasks() 中已经加了 JSON 解析异常和文件读取异常的处理,确保应用不会因为某个损坏文件就直接崩溃。
- **编码统一**:始终使用 encoding="utf-8",中文显示不会出乱码。
- **路径可移植性**:如果是正式项目,建议把 DATA_FILE 换成 `pathlib.Path.home() / ".myapp" / "tasks.json"`,存到用户主目录下更规范。
- **无需用户系统**:这套方案完全匿名,所有任务归属当前设备上的单个用户实例。如果将来需要多账户支持,直接扩展成 `{ "user1": [...], "user2": [...] }` 的结构就行。
- **Web 端兼容性说明**:Flet Web 应用运行在浏览器沙箱里,没法直接访问本地文件系统。这种情况下需要改用 `flet.session.set()` 配合后端 API,或者用 `localStorage`(通过 `page.client_storage`)。但桌面端(flet app)完全支持上述 JSON 方案。
### ✅ 总结
对于新手来说,用 json 模块配合 .json 文件实现 Flet 应用的数据持久化,是成本最低、理解最直观、落地最可靠的方案。它绕开了复杂的数据库配置和用户认证体系,却足够支撑绝大多数个人工具类应用的核心需求。记住三个关键动作:**读(启动时)→ 改(交互中)→ 写(变更后)**,你的待办清单从此真正“记得住”。
本文转载于:https://www.php.cn/faq/2334318.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。