用两个 Subagent 模拟学生与 AI 协作:课程作业管理 GUI 的三轮迭代

需求与实现范围

选择“课程作业管理 GUI”。程序使用 Python 标准库 Tkinter,支持课程和作业的增删改、周一至周日课表、作业截止状态与本地 JSON 保存。截止状态分为“已逾期”“24 小时内到期”“更晚到期”和“已完成”。启动命令是:

cd homework_manager
python3 main.py

课程时间采用 HH:MM,作业截止时间采用 YYYY-MM-DD HH:MM。数据写入程序目录的 data.json。代码分为界面入口 main.py、数据与规则 model.py,以及 tests/ 中的测试。

第 1 轮:生成初版

我给 AI 的提示词:

请用 Python 标准库 Tkinter 写一个可运行的‘课程作业管理’桌面 GUI,放在 homework_manager/ 目录。它面向大学生,至少支持:添加、编辑、删除课程(课程名、星期几、开始/结束时间、地点);按周一至周日展示课表;为课程添加、编辑、删除作业(标题、截止日期时间、完成状态);在界面中明确显示未完成作业距截止时间的状态,包括已逾期、24 小时内到期和更晚到期。数据重启后保留在本地 JSON。请提供 README 的启动方法、一个可运行的主程序和必要的测试。先实现初版,说明你做了什么、如何运行和已知限制。输入无效时给用户明确提示,不要静默失败。

AI 生成的初版要点: 它实现了三个界面页:课程管理、每周课表、作业管理;在数据层校验时间和必填字段,保存到 JSON,并在删除课程时一并删除其作业。初版 5 项单元测试通过,语法编译通过。初版满足了主要字段和操作,但测试尚未覆盖同一天的课程时间冲突。

第 2 轮:修复课程时间冲突

发现的问题: 我在临时数据文件中添加周一 08:00–10:00 的“软件工程”,再添加周一 09:00–11:00 的“高等数学”,初版将两门课都保存了。

我给 AI 的修改要求:

我运行了初版的 5 个单元测试,全部通过;又用临时数据文件添加周一 08:00–10:00 的‘软件工程’和周一 09:00–11:00 的‘高等数学’,程序把两门都保存了。这会让课表出现时间冲突。请在新增和编辑课程时拒绝同一天时间重叠的课程,错误提示中写出冲突课程名与时间;编辑时不要误判课程与自己冲突。允许一门课结束时另一门恰好开始,也允许不同星期相同时段。请加相应单元测试,并说明改动与验证结果。保留初版数据格式和已有功能。

AI 实际修改: model.py 在新增和编辑课程写入前检查同日时间区间是否重叠,编辑时排除当前课程。冲突提示给出已有课程的名称与时段。时间区间使用严格比较,因此 08:00–10:00 与 10:00–11:00 可以衔接;不同星期的相同时段也允许。新增 3 项测试后,8 项测试全部通过,原有 JSON 格式保持不变。

核心判断相当于:

same_day = existing["weekday"] == candidate["weekday"]
overlap = candidate["start"] < existing["end"] and existing["start"] < candidate["end"]
if same_day and overlap:
    raise ValueError("课程时间冲突")

实际实现还排除了编辑中的课程自身,并在异常中写出冲突课程和时间。

第 3 轮:让截止提醒在打开程序时可见

发现的问题: 初版的截止状态只显示在“作业管理”页。程序默认打开“课程管理”页,不主动切页便看不到快到期的作业;每分钟刷新还会重建列表,清掉当前选择。

我给 AI 的修改要求:

课程时间冲突修复后,我重跑 8 个测试都通过。现在提醒仍藏在‘作业管理’页,程序刚打开时我看不到是否有快到期的作业。请在主窗口顶部加入始终可见的提醒摘要,显示‘已逾期 X 项、24 小时内到期 Y 项’;只统计未完成作业,首次打开和每分钟刷新都要更新。点击摘要能切换到作业管理页;不要用每分钟弹窗打断用户。请把统计逻辑提取为可独立测试的函数,用固定当前时间测试已逾期、恰好 24 小时、超过 24 小时、已完成四种情况。若定时刷新会清掉当前列表选择,也请保留选择。请说明实际改动和验证结果。

AI 实际修改: 主窗口顶部增加可点击的提醒摘要,点击后切到作业页。首次打开、数据变更和每分钟定时刷新都会更新摘要;刷新时会恢复仍存在的课程、课表和作业选中项。model.py 中新增可独立测试的 reminder_counts(),只统计未完成作业。最终 10 项测试通过,语法编译通过。

我的检查与验证

我没有只看 AI 汇报的“测试通过”。在临时 JSON 文件里,我实际添加了冲突、相邻和不同星期的课程,重启读取后确认:重叠被拒绝,正常课程被保留。又构造四项作业,在固定时刻 2026-10-10 12:00 检查逾期、恰好 24 小时、超过 24 小时和已完成逾期四种情况,提醒计数为 (1, 1),只计入应提醒的两项。独立重跑的结果是:

python3 -m unittest discover -s tests -v
Ran 10 tests
OK

python3 -m py_compile main.py model.py
通过

我也审查了主程序:初始化和每分钟定时任务都会调用刷新逻辑,摘要按钮指向作业页,刷新会恢复仍存在的选中项。验证边界:当前执行环境创建一个空的 Tk 窗口也会以退出码 134 结束,因此这里完成的是数据逻辑、刷新逻辑与代码审查,尚未完成真实窗口点击和视觉检查。按照课堂“功能可演示”的标准,仍需在能正常运行 Tkinter 的图形桌面补做界面验收。

心得

最大意外是初版 5 项测试全过,课表却仍允许两门课在同一时间重叠。AI 很快补上了冲突校验,但这次遗漏说明:测试通过只代表已写出的场景成立。要让软件真正符合使用习惯,我还得主动提出具体反例,检查没有写进初版测试的边界。

文章摘自:https://www.cnblogs.com/zhurui125/p/23251622/ai-subagent-coursework-gui