使用对话式大模型完成大学生作业 DDL 管理器——一次四轮 AI 编程实践
项目源代码:https://github.com/wangyukai585/homework-ddl-manager
一、需求与意图描述
这次练习要求使用 AI IDE 或对话式大模型完成一个软件需求,并保留至少两轮迭代记录、一次验证说明和一条心得。我选择开发“大学生作业 DDL 管理器”,因为大学生通常同时面对多门课程,作业标题、截止日期、优先级和完成状态很容易分散在不同平台中。
我的目标是做一个不依赖网络的桌面程序:用户可以集中记录作业,用颜色识别截止时间,通过筛选和统计了解当前任务,并把数据导出为 Excel 可以正常打开的 CSV。
最终技术方案如下:
- Python 3.12.7
- Tkinter / ttk 图形界面
- SQLite 本地数据库
- Python 标准库
csv导出文件 - macOS 26.6.2,Tk 8.6
- AI 工具:Codex 桌面端
- 不使用第三方 Python 库
二、最终实现的功能
- 添加、查看、修改和删除作业。
- 标记“已完成”或“未完成”。
- 使用 SQLite 自动建表并持久化保存。
- 校验空课程、空标题、日期格式和真实日期。
- 删除前确认,未选择记录时给出提示。
- 按课程和完成状态筛选,并按标题关键字搜索;三个条件可以同时使用。
- 按截止日期从早到晚排列。
- 逾期、3 天内、7 天内、普通未完成和已完成作业使用不同颜色。
- 显示作业总数、已完成、未完成、逾期未完成和完成率。
- 选择保存位置并导出 UTF-8 BOM CSV。
三、第 1 轮:生成基础版本
1. 我给 AI 的提示词
请使用 Python 3 和 Tkinter 开发一个“大学生作业 DDL 管理器”桌面 GUI 程序。
第一版需要实现以下功能:
1. 使用 SQLite 数据库保存作业,数据库文件名为 homework.db。
2. 作业字段包括:编号、课程名称、作业标题、截止日期、优先级、完成状态和备注。
3. 用户可以添加、查看、修改、删除作业。
4. 可以把作业标记为“已完成”或“未完成”。
5. 主界面使用 ttk.Treeview 显示全部作业。
6. 数据库和数据表不存在时自动创建。
7. 程序关闭并重新启动后,原有数据仍然存在。
8. 所有代码暂时写在一个 app.py 文件中,不使用第三方库。
9. 请提供完整可运行代码,不要省略任何部分。
10. 对主要类和函数添加中文注释,并告诉我如何运行程序。
2. AI 实际完成了什么
AI 创建了三个主要类:HomeworkDatabase 负责 SQLite,HomeworkDialog 负责添加和修改表单,HomeworkApp 负责主窗口。第一版已经可以自动创建数据库、显示 Treeview、执行增删改查,并切换完成状态。数据库路径固定为 app.py 同目录下的 homework.db,所以从不同目录启动也不会生成多份数据。
3. 运行后发现的问题
语法检查和数据库测试都通过了,但第一次用 /usr/bin/python3 app.py 启动时窗口几乎空白。程序没有抛出异常,说明只看终端输出是不够的。我把“打开以后是空白”继续告诉 AI。AI 用最小 Tk 程序交叉验证,发现 macOS 自带的 Tk 8.5 连显式设置颜色的标签都不能正常绘制。
最后改用本机已经安装的 Anaconda Python 3.12.7 和 Tk 8.6,并增加跨平台 clam 主题后,界面恢复正常。这个问题也成为本次实践中最重要的一次真实调试。
四、第 2 轮:输入校验和安全操作
1. 我给 AI 的修改要求
请在当前 app.py 的基础上修改,不要删除已经实现的增删改查和 SQLite 数据保存功能。
我在运行初版程序后,发现输入校验和删除操作不够安全。请进行以下修改:
1. 课程名称和作业标题不能为空;为空时弹出明确提示,并且不能保存。
2. 截止日期必须采用 YYYY-MM-DD 格式。
3. 不仅要检查日期字符串格式,还要检查日期是否真实存在,例如 2026-02-30 必须判定为无效日期。
4. 优先级只能是“高”“中”“低”,使用下拉框选择。
5. 删除作业前弹出确认对话框。
6. 用户没有选中作业就点击修改、删除或标记完成时,弹出提示,不允许程序报错。
7. 数据库操作失败时弹出错误提示。
8. 保留当前界面和原有功能。
请返回修改后的完整 app.py,并简要说明你具体修改了哪些函数。
2. AI 实际修改了什么
AI 在 HomeworkDialog.save() 中分两步验证日期:先用正则表达式强制 YYYY-MM-DD,再用 datetime.strptime() 检查真实日期。因此 2026/10/01 属于格式错误,2026-02-30 属于日期不存在,两种情况会显示不同提示。
此外,AI 统一使用 _selected_values() 处理未选择记录,使用 messagebox.askyesno() 确认删除,并增加 _show_database_error() 捕获读取、添加、修改、删除、状态更新和数据库初始化异常。
3. 验证结果
我测试了空课程、空标题、斜杠日期、不存在日期、未选择记录和取消删除。所有错误输入都没有写入数据库,取消删除后记录数保持不变。模拟数据库读取失败时会显示错误对话框,程序不会直接崩溃。
五、第 3 轮:筛选、搜索和截止日期颜色
1. 我给 AI 的修改要求
请继续修改当前 app.py,不要破坏已有的增删改查、输入校验和 SQLite 数据保存功能。
请增加以下功能:
1. 在主界面增加课程筛选下拉框。
2. 增加完成状态筛选,可以选择“全部”“未完成”“已完成”。
3. 增加标题关键字搜索框。
4. 筛选条件和搜索关键字可以同时使用。
5. 增加“重置筛选”按钮。
6. 列表默认按照截止日期从早到晚排列。
7. 根据今天的日期为未完成作业设置颜色:已经逾期为深红色;0—3天内为红色;4—7天内为橙色;其他未完成为正常颜色;已完成为灰色。
8. 每次添加、修改、删除或改变完成状态后,自动刷新列表和筛选选项。
9. 请避免重复创建数据库连接或重复绑定界面事件。
请返回修改后的完整 app.py,并说明新增了哪些函数,以及日期颜色是如何计算的。
2. AI 实际修改了什么
AI 新增 get_filtered(),把课程、状态和标题关键词组合成一条参数化 SQL,而不是在界面中重复遍历数据。get_course_names() 为课程下拉框提供选项,refresh_filter_options()、apply_filters()、reset_filters() 和 refresh_all() 管理刷新流程。
数据库连接被改成整个程序生命周期复用一个连接,关闭窗口时才释放;筛选事件只在控件创建时绑定一次。
日期颜色由 _deadline_color_tag() 计算:
days_remaining = (due_date - today).days
- 小于 0:深红色;
- 0 到 3:红色;
- 4 到 7:橙色;
- 大于 7:正常色;
- 如果已经完成,优先显示灰色。
3. 验证结果
我同时选择“数据库”“未完成”并搜索 SQL,结果只剩一条符合全部条件的作业。颜色边界使用 -1、0、3、4、7、8 天逐项测试,避免只测区间中间值。已完成但已经过期的作业显示灰色,不会错误显示为逾期。
六、第 4 轮:统计与 CSV 导出
1. 我给 AI 的修改要求
请在当前 app.py 的基础上继续修改,保留全部已有功能。
请增加统计和导出功能:
1. 在主界面顶部显示作业总数、已完成数量、未完成数量、逾期未完成数量和完成率。
2. 完成率使用百分比显示,保留一位小数;没有作业时显示 0.0%,不能发生除零错误。
3. 每次添加、修改、删除和改变完成状态后自动更新统计。
4. 增加“导出 CSV”按钮。
5. 用户可以通过文件选择对话框选择保存位置。
6. CSV 文件包含课程、标题、截止日期、优先级、状态和备注。
7. CSV 使用 UTF-8 with BOM 编码,保证使用 Excel 打开时中文不乱码。
8. 导出成功后提示导出了多少条记录。
9. 用户取消选择保存位置时,不报错,也不生成文件。
10. 请返回完整 app.py,并说明统计和导出功能分别由哪些函数实现。
2. AI 实际修改了什么
get_statistics() 使用一次 SQL 聚合查询统计四个数量,refresh_statistics() 更新顶部面板。完成率使用安全分支:
completion_rate = completed / total * 100 if total else 0.0
export_csv() 通过 asksaveasfilename() 获取路径;取消时立即返回。真正写入时使用 csv.writer、newline="" 和 encoding="utf-8-sig"。导出后提示实际记录数。
3. 验证结果
在临时数据库中加入 5 项作业并完成 1 项后,界面显示总数 5、已完成 1、未完成 4、逾期未完成 1、完成率 20.0%。清空临时数据后显示 0.0%,没有除零。
CSV 文件以 EF BB BF 开头。我再用 Python csv.reader 读取导出的文件,中文正常,含逗号的备注仍然是一个字段。取消文件选择后没有生成文件。
七、我的检查与验证方法
我没有只根据代码判断程序正确,而是采用了以下方法:
- 正常值和异常值结合:既测试合法表单,也测试空值、错误格式和不存在日期。
- 边界值测试:日期颜色测试
-1、0、3、4、7、8天,完成率测试 1/5 和 0/0 两个分支。 - 重新连接验证持久化:写入临时数据库后关闭连接,再创建新的数据库对象并读取。
- 交叉验证输出:CSV 同时检查 BOM 原始字节和重新解析后的字段。
- 回归测试:每轮新增功能后重新检查原有 CRUD、完成状态和持久化。
- 界面实测:实际查看主界面、错误提示、筛选区、统计区和颜色,而不是只看终端没有报错。
项目中的 acceptance_test.py 使用临时数据库,不会修改正式数据。执行结果为 24 项全部通过:
/opt/anaconda3/bin/python3 acceptance_test.py
另外,我把每个用例的操作、预期结果和实际结果单独整理成表格,方便逐项复查。
八、心得:AI 最让我惊喜和失望的地方
本次协作最大的意外来自环境,而不是业务代码。AI 生成的初版通过语法检查、数据库测试也正常,但系统 Tk 8.5 显示的却是空白窗口。这说明“没有异常”不代表“软件可用”,GUI 必须实际打开观察。
AI 最让我惊喜的是,它能够在保留原有结构的情况下快速加入组合筛选、日期颜色、统计和 CSV 导出;当我把要求写成明确的输入、输出和边界时,修改结果也比较稳定。AI 让我失望或需要警惕的地方是,初版看起来完整,却不会自动覆盖所有运行环境和边界条件。旧 Tk、零数据完成率、无效日期和 CSV 中文编码,都是在运行和测试后才确认的。
我的结论是:AI 编程的关键不是不断说“优化一下”,而是明确说明不能破坏哪些旧功能、具体修改什么,以及怎样判断正确。AI 可以负责快速生成和迭代,但运行、质疑、测试和最终责任仍然属于开发者。
九、运行方法
git clone git@github.com:wangyukai585/homework-ddl-manager.git
cd homework-ddl-manager
/opt/anaconda3/bin/python3 app.py
在其他带 Tk 8.6 的 Python 环境中,也可以使用:
python3 app.py
数据库会在第一次运行时自动生成。项目不需要安装第三方 Python 库。

浙公网安备 33010602011771号