PowerBox:我用 Flet 构建效率工具的第一次尝试
PowerBox 是我参与设计并完成整体构建的一款效率工具。它使用 Python 和 Flet,把 Todo、番茄钟、倒数日、主题设置和坚果云 WebDAV 同步放进同一个应用。
这个仓库要解决什么问题
我平时需要记录待办、专注时间和重要日期,但不想在几个小工具之间切换。我希望做一个统一入口:打开后可以进入不同功能,数据退出后仍然保留,有需要时还能通过坚果云在不同设备间同步。
这也是我第一次尝试把一个应用从界面做到本地存储和网络同步。三个功能需要共享主页、设置、生命周期和数据目录,作为同一个应用运行。
我采用的整体方案
应用以 Flet 为 UI 框架。main.py 和 web.py 提供启动入口与应用外壳,HomepageButton 组成主页导航,AnimatedSwitcher 在主页、Todo、番茄钟和倒数日之间切换。设置对话框管理主题、坚果云账号与同步操作。
三个业务模块各自独立:todo.py 定义任务与任务列表,pomo.py 负责计时、暂停、继续和统计,countdown.py 管理日期任务,datePicker.py 提供日期选择。各模块实现自己的 load() 与 save(),外壳在进入、返回和关闭时统一调用。
数据层没有引入数据库,而是在 data 目录保存 todo.json、pomo.json、countdown.json 和 settings.json。WebDAV 层把这四个文件上传到坚果云或从云端下载。字体、提示音和图标放在 assets 中,由 Flet 应用统一加载。
这套模块划分、页面切换和数据流是我参与整仓构建的一部分,三个功能从入口开始就按同一个应用组织。
三个模块如何管理状态
Todo 中,Task 负责单条任务的显示、编辑、完成和删除,TodoApp 管理集合、筛选和剩余数量。任务以名称和完成状态写入 JSON,加载时再恢复成控件。
倒数日采用相似结构,但状态变成名称和目标日期。模块根据当前日期计算剩余或已经过去的天数,并支持全部、正数日和倒数日筛选。
番茄钟状态更复杂。tmclock 保存工作或休息阶段、计时长度、暂停状态和累计数据。后台线程负责读秒,threading.Event 用于暂停与继续;页面退出或程序关闭时,外壳向计时模块发送停止信号,避免线程留在后台。
这种拆分让主页不需要理解任务或计时细节,只负责页面生命周期。三个模块的数据也不会互相覆盖。
WebDAV 同步怎么接进应用
应用通过 easywebdav 连接坚果云。登录成功后可以从云端覆盖本地数据;退出程序时,如果网络可用,则上传最新 JSON。第一次连接还会创建远端 powerbox 目录和检查文件。
我遇到过断网状态下已登录用户无法正常关闭的问题,于是在关闭事件中先检测坚果云地址,只有网络可用才执行远端删除与上传,然后销毁窗口。这个处理先保证了离线时应用仍能退出。
当前同步采用四个文件整份覆盖,没有做多端冲突合并。它满足我当时的单用户使用方式,但两台设备同时修改时,后上传的一方会覆盖之前数据。账号和应用密码也写入 settings.json,适合个人实验,不适合进一步分发。
截至这次提交的复盘
PowerBox 已经把 Flet 页面、三个功能模块、后台计时、JSON 持久化、设置与 WebDAV 同步接成完整应用。运行时产生的数据由程序自动初始化,用户可以在一个窗口中完成主要操作。
下一步需要优先改进同步与计时。WebDAV 数据应加入版本或更新时间,上传可以先写临时文件再替换;凭据不应继续明文存储。计时也可以改成记录目标时间,再用当前时间计算剩余量,减少循环休眠带来的累计误差。
做到这个版本时,我已经碰到一个桌面工具最基本的完整链路:界面不是全部,页面状态、后台线程、本地文件、网络异常和关闭流程都要一起工作。PowerBox 的实现还很直接,但它确实是我从整体上构建出来的第一个应用之一。




