20243222 实验四 《Python综合实践》实验报告

20243222 2025-2026-2 《Python程序设计》实验四报告——基于Python的微信课表与备忘录智能提醒系统设计与实现

课程:《Python程序设计》
班级: 2432
姓名: 杨婕
学号:20243222
实验教师:王志强
必修/选修: 公选课

一、项目背景

作为大学生,日常学习中经常会遇到一些比较实际的问题。比如每周都要查看课表截图,上课前还要临时确认教室;有些事情比如交作业、开会、带实验报告,也很容易因为没有及时提醒而忘记;天气变化也会影响上课出门,比如下雨忘记带伞、降温忘记加衣服。

所以我想做一个比较贴近日常生活的小工具,让它能够在上课前提醒我“在哪里上什么课”,同时还能提醒备忘录事项。如果提醒能直接发到微信里,会比只在控制台输出更加实用,因为微信是平时最常用的软件之一。

基于这个想法,我完成了这个Python结课项目:基于Python的微信课表与备忘录智能提醒系统。

这个项目主要实现了课表图片识别、文字课表导入、课程提醒、备忘录提醒、微信自动发送、天气建议和数据可视化等功能。整体目标不是做一个特别复杂的软件,而是把Python学过的知识综合起来,做一个真正能运行、能展示、也有一定实用意义的小系统。

二、项目功能概述

2.1 课表图片识别功能

项目可以读取课表图片,并通过OCR技术识别图片中的文字。由于课表不是普通文本,而是按照星期和节次排列的网格,所以程序还结合了课表的结构,对图片进行网格切割,再提取课程信息。

2.2 文字课表导入功能

考虑到OCR识别不一定完全准确,项目也提供了文字课表导入功能。用户可以把课程整理成固定格式文本,再导入系统。这样即使图片识别有误,也可以通过手动整理文本保证课程数据准确。

2.3 课程提醒功能

系统可以在上课前10分钟自动提醒。提醒内容包括课程名称、上课教室、上课时间、本节课安排和天气建议。

2.4 备忘录提醒功能

用户可以添加备忘录事项,例如交作业、开会、带材料等。系统会在事项前10分钟通过微信发送提醒。

2.5 微信自动发送功能

项目不是只把提醒显示在控制台,而是会自动操作电脑端微信,把消息发送到文件传输助手中。这样提醒更加直观,也更符合日常使用习惯。

2.6 天气建议功能

课程提醒中会加入天气建议。例如下雨提醒带伞,天气热提醒穿短袖和注意补水,天气冷提醒加外套,风大提醒注意随身物品。

2.7 数据可视化功能

项目可以根据数据库中的课程和备忘录生成统计图,例如课程数量分布图和备忘录日期分布图,让实验结果更加直观。

2.8 防重复提醒功能

系统会记录已经发送过的提醒,避免同一个课程或同一个备忘录在提醒窗口内重复发送。

三、实验环境

3.1 开发环境

本项目在Windows系统下开发和测试,使用PyCharm作为开发工具,编程语言为Python。数据库使用SQLite,因为SQLite不需要额外安装数据库服务,适合本地小型项目。

微信提醒部分使用Windows电脑端微信。项目主要通过PyCharm终端输入命令进行运行和测试。

3.2 主要依赖库

项目中使用APScheduler实现定时任务,用sqlite3保存课程、备忘录和发送记录,用requests请求天气接口,用python-dotenv读取配置文件。

课表图片识别部分使用CnOCR进行文字识别,使用OpenCV和Pillow处理图片。微信自动发送部分使用pyautogui、pyperclip和pywin32。数据可视化部分使用pandas和matplotlib。

四、项目文件结构

4.1 项目整体结构

项目主要文件结构如下:
image
image

4.2 各文件作用

main.py是程序入口,负责接收命令并调用对应功能。

config.py用于读取配置文件,例如天气 API Key、城市名、微信接收对象和提前提醒时间。

models.py用于定义课程和备忘录的数据结构。

db.py负责数据库操作,包括初始化数据库、添加课程、添加备忘录、查询数据和记录已发送提醒。

timetable_ocr.py负责课表图片识别和文字课表解析。

scheduler_service.py负责定时提醒逻辑,每隔一段时间检查是否有课程或备忘录需要提醒。

notifier.py负责微信自动发送。

weather_service.py负责获取天气信息并生成建议。

visualize.py负责生成课程和备忘录统计图。

data文件夹用于存放课表图片、文本课表和数据库文件。

output文件夹用于保存生成的可视化图表。

4.3 模块化设计说明

项目采用模块化设计,不同功能放在不同文件中。这样做的好处是结构清楚,后期调试也更方便。比如微信发送有问题时主要检查notifier.py,天气功能有问题时主要检查weather_service.py,课表识别有问题时主要检查timetable_ocr.py。

4.4 项目核心代码截图说明

项目采用模块化设计,每个文件负责不同功能。为了让项目结构更加清楚,我在后面的功能介绍中分别插入对应代码截图。

其中,models.py 主要对应课程和备忘录数据模型;config.py对应配置读取;db.py对应数据库初始化、数据增删查和防重复提醒;timetable_ocr.py对应课表图片识别和文字课表导入;scheduler_service.py对应课程提醒和备忘录提醒;notifier.py对应微信自动发送;weather_service.py对应天气建议;visualize.py对应数据可视化;main.py 对应命令行入口。
image
这张图展示的是models.py文件中的Course和Memo数据模型。Course 用来保存课程的星期、开始时间、结束时间、课程名称、教室和本节课安排;Memo 用来保存备忘录的提醒时间、标题和内容。先定义统一的数据结构,可以让后面的数据库操作和提醒逻辑更加清楚。
image
这张图展示的是config.py文件中的配置读取代码。天气 API Key、城市名、微信接收对象和提前提醒时间都通过.env文件读取。这样后续如果要修改城市或者提醒对象,不需要直接修改主程序代码,项目会更加灵活。

五、系统总体设计

5.1 系统运行流程

系统运行流程大致如下。

用户先导入课表图片或文字课表,程序解析课程信息,并保存到SQLite数据库中。用户也可以通过命令添加备忘录。启动提醒系统后,程序每60秒检查一次当前时间.

如果发现某门课程距离开始时间小于等于

点击查看代码
10分钟,系统就会生成课程提醒,并附加天气建议,然后通过微信发送。如果发现某个备忘录事项距离事项时间小于等于10分钟,也会生成备忘录提醒并发送到微信。 ![image](https://img2024.cnblogs.com/blog/3782391/202605/3782391-20260526171435302-627062159.png) ![image](https://img2024.cnblogs.com/blog/3782391/202605/3782391-20260526171445064-359374539.png)

提醒发送成功后,程序会把发送记录写入数据库,避免同一条提醒重复发送。用户还可以运行可视化命令,生成课程和备忘录统计图。
image

5.2 系统设计思路

这个项目虽然看起来是提醒程序,但实际上包含输入、存储、处理和输出多个部分。

输入部分包括课表图片、文字课表和备忘录命令。存储部分使用SQLite保存课程、备忘录和发送记录。处理部分包括OCR识别、课表网格切割、时间判断、天气建议和防重复提醒。输出部分包括微信提醒和可视化图表。

在设计时,我也考虑了一些实际问题,比如OCR识别不准怎么办,天气API获取失败怎么办,微信自动化不稳定怎么办,提醒重复发送怎么办。这些问题如果不处理,程序虽然能跑,但实际使用体验会比较差。

六、数据库设计

6.1 课程数据设计

课程信息保存在courses表中。每条课程记录包括课程编号、星期、开始时间、结束时间、课程名称、上课教室和本节课安排。

例如一条课程数据可以表示为:

周一 10:00-11:40 概率论与数理统计 教学楼515

其中,星期在数据库中用数字保存,周一为 1,周二为 2,依次类推。这样程序判断今天是否有课时会更加方便。

6.2 备忘录数据设计

备忘录信息保存在 memos 表中。每条备忘录包括事项时间、标题和内容。

例如:
2026-05-26 14:00 交 Python 作业,内容是检查代码、报告和演示截图。

程序会根据事项时间判断是否需要提前10分钟提醒。

6.3 发送记录设计

发送记录保存在sent_log表中,主要作用是防止重复提醒。

因为程序每60秒检查一次,如果没有发送记录,同一条课程或备忘录可能会在10分钟提醒窗口内重复发送。加入sent_log后,程序可以判断这条提醒是否已经发送过。如果已经发送过,就跳过。

这个设计虽然不复杂,但在实际运行时很重要。它让程序从“能发提醒”变成了“比较合理地发提醒”。

6.4 数据库相关代码说明

数据库功能主要写在db.py文件中。项目使用SQLite数据库保存课程、备忘录和发送记录。数据库初始化时会创建courses、memos和sent_log三张表。

image
image
这两张图展示的是db.py文件中的get_conn和init_db函数。get_conn用于连接SQLite 数据库,init_db用于初始化数据表。其中courses表保存课程信息,memos表保存备忘录信息,sent_log表保存已经发送过的提醒记录。

image
image

这两张图展示的是 db.py 文件中的 add_course、add_courses 和 add_memo 函数。图片识别或文字导入得到课程信息后,会调用 add_course 或 add_courses 写入数据库;用户添加备忘录时,会调用 add_memo 保存事项时间、标题和内容。

image
image

这张图展示的是 db.py 文件中的 list_courses 和 list_memos 函数。用户运行 python main.py list 时,程序会调用这两个函数,从数据库中读取课程和备忘录,并在终端中显示出来。

image
这张图展示的是db.py文件中的 was_sent 和 mark_sent 函数。was_sent用来判断某条提醒是否已经发送过,mark_sent用来记录发送成功的提醒。因为程序每60秒检查一次,如果没有这个设计,同一条提醒可能会在10分钟提醒窗口内重复发送。

这部分代码虽然不算复杂,但对实际运行很重要。它让系统不是简单地“能提醒”,而是能够比较合理地控制提醒次数。

七、功能一:课表图片识别

7.1 功能说明

课表图片识别是项目中比较重要的功能。用户把课表截图放到data文件夹中,运行命令后,程序会识别图片中的课程信息,并尝试导入数据库。

运行命令:

python main.py import-image data/kebiao.jpg
课表原图截图

95bf3fc5a41be72fa5e3520cc0658a4d

课表图片识别结果截图

image

7.2 遇到的问题

一开始我以为只要对整张课表图片做OCR,就能直接得到课程信息。但实际测试发现,课表图片不是普通文章,而是一个二维网格。

课表横向是周一到周日,纵向是第 1 节到第11节,中间有不同颜色的课程块。直接识别整张图片时,文字顺序可能会比较乱,有些课程名会被拆开,不同课程的文字也可能混在一起。
比如OCR可能识别出这样的内容:
概率论与
信号与系
数理统计

教学楼515
教学楼415
人可以看出来“概率论与数理统计”和“信号与系统”是两门课,但程序如果只看这些文字,很难判断哪些文字属于同一门课。

7.3 解决方法

为了解决这个问题,我改用了网格切割法。
根据课表规则,1、2节对应08:00到09:40,3、4节对应10:00到11:40,5、6 节对应13:40到15:20,7、8节对应15:30到17:10,9、10、11节对应18:30到21:05。

程序会先识别星期和节次的位置,然后把课表区域切成7列和5个时间段。每个小格子单独判断是否有课程色块。如果有课程,就单独对这个区域进行 OCR,这样可以减少不同课程之间互相混在一起的问题,识别结果也更接近真实课表。

7.4 识别结果查看

导入图片课表后,可以运行:

python main.py list

可以看到:image

7.5 功能分析

这个功能的难点不只是OCR,而是如何理解课表这种结构化图片。OCR只能识别文字,但不能直接告诉程序这些文字属于哪一天、哪一节课、哪个教室。

所以项目中加入了网格定位和节次换算逻辑。这个过程让我感觉到,实际项目中使用第三方库只是第一步,更重要的是根据自己的需求处理库返回的数据。

7.6 课表图片识别对应代码说明

课表图片识别功能主要写在timetable_ocr.py文件中。这个文件中最关键的代码包括节次时间映射、图片识别主函数、课程色块判断函数,以及课程名和教室拆分函数。

image
image
这张图展示的是 timetable_ocr.py 文件中的 TIME_GROUPS 代码。它定义了课表节次和实际上课时间的对应关系。例如1、2节对应08:00到09:40,3、4节对应10:00到11:40,5、6节对应13:40到15:20,7、8节对应15:30到17:10,9、10节对应18:30到20:10。程序在生成课程提醒时,会根据这个对应关系确定具体上课时间。

image
image
image
这张图展示的是 timetable_ocr.py 文件中的 parse_timetable_image 函数。这个函数是课表图片识别功能的核心。程序会先读取课表图片,然后根据课表的大致位置进行网格切割,再按照星期和节次逐个区域识别。相比直接对整张图片OCR,这种方式可以减少课程文字混在一起的问题。

image
image
这张图展示的是 timetable_ocr.py 文件中的 has_course_block 函数。这个函数用于判断某个课表格子里是否存在课程色块。因为课表中有很多空白格子,如果每个格子都OCR,不仅浪费时间,还容易出现误识别。所以程序会先判断是否有课程色块,再决定是否进行OCR。

image
image
image
image
这些图展示的是 timetable_ocr.py 文件中的 split_course_name_and_room 函数。OCR 识别出来的只是文字,程序还需要进一步判断哪些文字是课程名称,哪些文字是教室。这里通过“教学楼”“电教楼”“操场”“实验室”等关键词来判断教室位置,然后把课程名和教室拆分出来。

这部分代码体现了课表图片识别的关键思路:OCR只是第一步,真正难的是结合课表结构,把图片中的文字整理成程序可以使用的课程数据。

八、功能二:文字课表导入

8.1 功能说明

由于 OCR 识别不可能完全准确,所以项目提供了文字课表导入功能。当图片识别结果不理想时,可以手动整理成固定格式文本,再导入系统。

8.2 文本格式

文字课表格式如下:

周一 10:00-11:40 概率论与数理统计 教学楼515 内容: 讲例题
周三 13:40-15:20 计算机网络 教学楼415 内容: 测试
周四 15:30-17:10 信息安全概论 教学楼201 内容: 无

每一行包括星期、开始时间、结束时间、课程名称、教室和本节课安排。

8.3 使用命令

导入文字课表的命令如下:

python main.py import-text data/sample_timetable.txt

8.4 功能分析

这个功能虽然没有图片识别那么自动化,但非常实用。因为现实中的课表图片可能清晰度不同、格式不同,OCR结果也可能出错。

有了文字导入功能,即使OCR识别失败,也可以手动整理文本后导入。这样项目既有自动化功能,也有稳定的兜底方案。

8.5 文字课表导入对应代码说明

文字课表导入功能同样写在 timetable_ocr.py 文件中,主要对应 WEEKDAY_MAP 和 parse_timetable_text 函数。

image
image
image
image
这张图展示的是 timetable_ocr.py 文件中的文字课表解析代码。WEEKDAY_MAP 用来把“周一”“周二”等文字转换成数字,parse_timetable_text 函数用来解析每一行课程文本。程序会从文本中提取星期、开始时间、结束时间、课程名称、教室和本节课安排,然后生成 Course 对象并保存到数据库。

这个功能是图片识别的补充。如果OCR识别结果不准确,可以手动整理文字课表后再导入,这样可以保证课程数据更加可靠。

九、功能三:课程提醒

9.1 功能说明

课程提醒是项目的核心功能。系统会在上课前10分钟通过微信发送提醒。

提醒内容包括课程名称、教室、时间、本节课安排和天气建议。

提醒格式大致如下:

【上课提醒】
还有 10 分钟左右上课
课程:课程名称
教室:上课教室
时间:开始时间-结束时间
本节课安排:本节课安排
天气:天气情况和建议

9.2 实现过程

课程提醒主要由 scheduler_service.py 实现。程序启动后,使用APScheduler每60秒执行一次检查。

程序会先获取当前时间,然后查询数据库中的课程。对于每一门课程,程序会判断它是不是今天的课,再计算当前时间距离课程开始时间还有多久。如果时间差在 0 到 10 分钟之间,就生成提醒消息,并调用微信发送模块发送。

启动提醒系统的命令如下:

python main.py run

9.3 防重复提醒设计

课程提醒中加入了“一天之内同一课程只提醒一次”的逻辑。

这样做是为了避免OCR重复识别课程,或者同一天出现同名课程时重复提醒。另外,程序每分钟检查一次,如果不记录发送状态,也可能导致同一条提醒重复发送。

因此程序会根据日期和课程名生成提醒标识。如果今天这门课已经提醒过,就不会再次发送。

9.4 测试方法

为了不用真的等到上课时间,测试时可以添加一门9分钟后开始的课程。
测试命令:

python -c "from datetime import datetime,timedelta; from db import init_db,add_course; from models import Course; init_db(); now=datetime.now(); t=now+timedelta(minutes=9); end=t+timedelta(minutes=40); weekday=now.weekday()+1; add_course(Course(None,weekday,t.strftime('%H:%M'),end.strftime('%H:%M'),'课程提醒功能测试','测试教室','测试课程提醒、天气提醒和微信发送')); print('已添加测试课程:周', weekday, t.strftime('%H:%M'), '-', end.strftime('%H:%M'))"

然后运行:
python main.py run
测试结果是微信成功收到了课程提醒。
image

9.5 功能分析

课程提醒功能把数据库、时间判断、天气模块和微信发送连接到了一起,是整个项目最核心的部分。
它不是简单地查询课程,也不是简单地打印信息,而是在合适的时间主动提醒用户。这让项目更接近真实使用场景。

9.6 课程提醒对应代码说明

课程提醒功能主要写在 scheduler_service.py 文件中,对应 check_courses函数。
image
image

这张图展示的是scheduler_service.py文件中的check_courses函数。程序会先获取当前时间和今天星期几,然后遍历数据库中的课程。对于每一门课程,程序会判断它是不是今天的课,再判断当前时间是否进入上课前10分钟提醒范围。如果满足条件,就生成课程提醒消息,并调用微信发送模块发送。
提醒发送成功后,程序会调用 mark_sent 函数记录发送状态。下一次检查时,如果was_sent判断这条课程提醒已经发过,就不会重复发送。这样可以避免微信连续收到多条相同提醒。

这段代码把课程数据、时间判断、天气建议、微信发送和防重复提醒连接在一起,是整个项目中最核心的代码之一。


十、功能四:备忘录提醒

10.1 功能说明

备忘录功能用于记录临时事项,比如交作业、开会、带实验报告、提交材料、参加考试等。系统会在事项前 10 分钟通过微信发送提醒。

10.2 添加备忘录

添加备忘录的命令如下:

python main.py add-memo --time "2026-05-26 14:00" --title "交 Python 作业" --content "检查代码、报告和演示截图"

10.3 提醒格式

微信收到的备忘录提醒大致如下:

【备忘录提醒】
事项:交 Python 作业
时间:2026-05-26 14:00
内容:检查代码、报告和演示截图

10.4 测试方法

测试时可以添加一个9分钟后的备忘录。

测试命令:

python -c "from datetime import datetime,timedelta; from db import init_db,add_memo; from models import Memo; init_db(); t=datetime.now()+timedelta(minutes=9); add_memo(Memo(None,t,'备忘录功能测试','这是测试事项前10分钟微信提醒')); print('已添加测试备忘录,事项时间:', t.strftime('%Y-%m-%d %H:%M'))"

然后启动提醒系统:

python main.py run

程序会在提醒时间内通过微信发送备忘录提醒。
image

10.5 功能分析

备忘录功能让项目不只局限于课表提醒,而是扩展成一个更通用的学习生活提醒工具。

当前版本支持添加、查看、提前提醒和防重复发送。虽然还没有实现修改和删除功能,但已经完整展示了备忘录提醒的核心流程。

10.6 备忘录提醒对应代码说明

备忘录提醒功能也写在scheduler_service.py文件中,主要对应check_memos函数。
image
这张图展示的是 scheduler_service.py 文件中的 check_memos函数。程序会读取数据库中的备忘录,并计算当前时间距离备忘录事项时间还有多久。如果时间差在 0 到 10 分钟之间,就生成备忘录提醒内容,并通过微信发送。

备忘录提醒同样进行防重复处理。这样即使程序每分钟检查一次,也不会让同一条备忘录重复发送多次。

image
image
这张图展示的是 scheduler_service.py 文件中的 run和ReminderScheduler函数。run创建定时任务,每60秒执行一次 ReminderScheduler。ReminderScheduler 中会同时检查课程提醒和备忘录提醒。

这个设计让程序不需要人工一直输入命令检查,而是启动后自动运行,符合提醒系统的使用场景。

十一、功能五:微信自动发送

11.1 功能说明

本项目最终的提醒不是只显示在控制台,而是发送到电脑微信中。这样提醒更直观,也更符合平时的使用习惯。

11.2 实现过程

在实现微信提醒时,我一开始尝试过使用微信自动化相关库。但实际测试时遇到了微信版本和系统组件兼容问题。后来我改用了更稳定的窗口自动化方案。

程序会先使用pywin32查找微信窗口并激活它,然后使用pyperclip把提醒内容复制到剪贴板,再通过pyautogui模拟快捷键粘贴,最后按回车发送。

这种方法虽然比较简单,但实际测试效果比较稳定,也适合课程项目演示。

11.3 微信发送测试

测试命令如下:

python -c "from notifier import WeChatNotifier; WeChatNotifier('文件传输助手').send('Python 微信发送功能测试成功')"

如果微信文件传输助手收到测试消息,说明微信发送模块正常。
image

11.4 注意事项

由于当前方案是模拟键盘和剪贴板操作,所以测试时需要提前登录电脑微信,并且最好手动打开“文件传输助手”聊天窗口。发送过程中不要频繁切换窗口,否则可能影响自动发送。

11.5 功能分析

微信自动发送功能是项目中最有真实感的部分。很多课程项目最后只是把结果打印到终端,而这个项目可以把提醒真正发到微信里。

测试时看到文件传输助手收到提醒,会明显感觉这个程序不只是“写出来了”,而是真的能用。

11.6 微信自动发送对应代码说明

微信自动发送功能写在notifier.py文件中,主要对应WeChatNotifier类中的send方法和active_wechat_window方法。

image
image

这张图展示的是notifier.py文件中的微信自动发送代码。程序会先查找电脑端微信窗口,然后将微信窗口激活。接着使用pyperclip把提醒内容复制到剪贴板,再通过pyautogui 模拟Ctrl+V粘贴,最后模拟Enter回车发送。

十二、功能六:天气建议

12.1 功能说明

课程提醒中会自动加入天气建议。例如下雨提醒带伞,天气冷提醒穿厚外套,天气热提醒穿短袖并注意补水,风大提醒注意随身物品。

12.2 实现过程

天气模块写在 weather_service.py 中。程序会从 .env文件读取天气API Key和城市信息。

配置示例:

OPENWEATHER_API_KEY=你的Key
CITY=Beijing,CN
WECHAT_TARGET=文件传输助手
REMIND_MINUTES=10

测试天气模块的命令如下:

python -c "from weather_service import get_weather_advice; print(get_weather_advice())"
image

12.3 功能分析

天气功能让提醒更贴近真实生活。它不是简单显示今天多少度,而是把天气转换成学生可以直接理解的建议,比如带伞、穿外套、注意补水。

这个细节让项目不只是一个定时器,而更像一个小型校园生活助手。

12.4 天气建议对应代码说明

天气建议功能写在 weather_service.py 文件中,主要对应 get_weather_advice 函数。
image
image
image
这些图展示的是 weather_service.py 文件中的 get_weather_advice 函数。程序会从配置文件中读取天气 API Key 和城市信息,然后请求天气接口,获取天气描述、温度和风速。接着根据天气情况生成建议,例如下雨提醒带伞,天气热提醒穿短袖和注意补水,天气冷提醒加外套,风大提醒注意随身物品。

这部分代码还加入了异常处理。如果天气API Key未生效、网络异常或者接口请求失败,程序不会直接崩溃,而是返回“天气获取失败”的提示。这样天气模块出问题时,不会影响课程提醒和备忘录提醒的正常运行。

十三、功能七:数据可视化

13.1 功能说明

项目还实现了简单的数据可视化功能,可以生成课程数量分布图和备忘录日期分布图。

13.2 使用命令

生成图表的命令如下:

python main.py viz

生成的图片会保存在output文件夹中,常见文件包括:

course_count_by_weekday.png
memo_count_by_date.png
image

13.3 功能分析

可视化功能不是提醒系统的核心,但它能让数据结果更直观。比如可以看到一周中哪一天课最多,也可以看到备忘录事项集中在哪些日期。

对于博客展示和实验报告来说,可视化结果也能让项目看起来更加完整。

十四、视频演示说明

点击观看视频

十五、代码托管到Gitee仓库

image

十六、实验中遇到的问题与解决方法

16.1 OCR 识别结果和课表不完全一致

最开始直接对整张课表图片做OCR,识别出来的文字顺序比较乱,不同课程的内容也容易混在一起。后来改成了网格切割法,把课表按星期和节次切成小区域,每个区域单独识别,效果明显更好。

这个问题让我意识到,OCR不是识别出文字就结束了。识别结果还需要结合具体业务场景进行理解。对于课表来说,文字的位置和所在格子非常重要。

16.2 微信自动化库兼容问题

在调试微信提醒时,遇到过微信自动化库和当前微信版本不兼容的问题。后来没有继续纠结某一个库,而是换成了更直接的窗口自动化方案。

程序通过激活微信窗口、复制内容、粘贴发送来完成提醒。这个方案虽然简单,但实际测试效果比较稳定,也比较适合课程项目演示。

16.3 天气API Key可能失效或未生效

天气 API在测试时可能出现401或网络请求失败。为了避免天气模块影响主程序,我给天气模块加了异常处理。

即使天气获取失败,程序也会返回提示信息,而不会导致课程提醒失败。

16.4 定时提醒容易重复发送

定时任务每60秒检查一次,如果不记录发送状态,同一条提醒可能会重复发送。为了解决这个问题,项目增加了 sent_log 表。

发送成功后写入记录,下次检查时如果发现已经发送过,就跳过。这个设计虽然不复杂,但非常实用。

十七、项目亮点

17.1 功能比较完整

项目不是单一功能,而是包含课表识别、课程提醒、备忘录提醒、微信发送、天气建议和可视化展示,整体上形成了一个小系统。

17.2 贴近真实生活场景

这个项目来源于日常学习生活。上课前忘记教室、忘记事项、出门忘记带伞,都是很真实的问题。所以这个项目不是为了炫技,而是为了尝试解决实际问题。

17.3 自动化和稳定性兼顾

项目既支持课表图片识别,也支持文本导入。图片识别提高自动化程度,文本导入保证稳定性。这个设计比较符合真实使用情况。

17.4 微信提醒效果直观

提醒不是停留在控制台,而是真的发送到微信中。测试时看到文件传输助手收到提醒,项目完成感会更强。

17.5 防重复提醒设计

定时程序很容易出现重复提醒问题,项目通过发送记录表解决了这个问题,使提醒更加合理。

十八、不足与改进方向

18.1 OCR准确率还可以继续提高

目前 OCR 对清晰课表效果较好,但如果图片模糊、裁剪不完整,还是可能识别错误。后续可以增加图像增强、手动框选区域、课程名词典纠错等功能。

18.2 微信发送依赖前台窗口

当前微信发送方式依赖桌面窗口操作,发送时最好不要切换窗口。后续如果有更稳定的接口,可以进一步优化。

18.3 备忘录功能还可以扩展

当前备忘录支持添加、查看和提醒,但还没有加入修改、删除、按日期查询等功能。后续可以继续完善,让备忘录更像一个完整的小工具。

18.4 可以增加图形界面

目前项目主要通过命令行运行,适合测试和课程演示。如果后续做成图形界面,普通用户使用起来会更方便。

十九、实验总结

通过这个Python结课项目,我完成了一个基于Python的微信课表与备忘录智能提醒系统。项目实现了课表图片识别、文字课表导入、课程提醒、备忘录提醒、微信自动发送、天气建议和数据可视化等功能。

这次项目让我最大的感受是:真正写一个能跑起来的小系统,和单独写一个课堂练习题很不一样。课堂练习通常只需要考虑输入和输出,但这个项目要考虑很多实际问题。比如 OCR 识别不准怎么办,微信库不兼容怎么办,API请求失败怎么办,提醒会不会重复发送,数据怎么保存,功能怎么组织才不乱。

这些问题在写代码之前不一定能想到,但在测试过程中都会慢慢暴露出来。解决这些问题的过程,其实比单纯写代码更锻炼人。
虽然这个项目还有可以完善的地方,但它已经实现了我最初想做的目标:能根据课表和备忘录主动提醒,并且通过微信发送消息。对我来说,它不只是一个结课作业,也是一个真正能和日常学习生活联系起来的小工具。

二十、课程总结

这个学期我们学习了Python这门课程。通过这一学期的学习,我从一开始对python编程比较陌生,到现在能够看懂大部分代码,对Python的基本用法和编程思路有了比较清楚的认识。
课程最开始讲了Python的基础知识,包括Python的特点、开发环境的使用、代码格式、变量和数据类型等内容。通过这些学习,我知道了Python语法比较简洁,但写代码时也要注意格式,尤其是缩进。变量、字符串、整数、浮点数这些内容看起来简单,但它们是后面写程序的基础。之后课程讲了输入输出、运算符、条件语句和循环语句。通过input和print,我学会了让程序接收信息并输出结果;通过if、elif、else,我知道了程序可以根据不同条件执行不同的内容;通过for和while循环,我学会了让程序重复完成一些操作。这些内容让我感觉编程其实就是把人的思路一步一步写清楚,让电脑按照这个逻辑去执行。
课程中还学习了列表、元组、字典等数据结构。通过这些内容,我学会了怎样保存和管理一组数据。比如列表适合存放一串有顺序的数据,字典适合用“键值对”的方式保存信息。刚开始我觉得这些内容有点容易混,但是通过练习以后,慢慢能分清它们各自适合用在什么地方。函数也是我觉得比较重要的一部分。通过学习函数的定义、调用、参数和返回值,我明白了写程序不能把所有代码都堆在一起,而是可以把重复使用的功能单独写出来。这样代码会更清楚,也更方便修改。
另外,课程还讲了文件操作、模块以及socket网络编程的基础内容。文件操作让我知道程序可以读取和保存数据,不只是运行完就结束。模块的学习让我认识到Python有很多现成的工具可以使用。socket这部分让我第一次接触到网络通信,知道了客户端和服务器之间可以通过程序发送和接收数据。虽然这部分内容对我来说有一定难度,但也让我感觉Python不只是能写一些简单计算程序,还可以和网络、实际应用联系起来。
除了Python本身的内容,我们还学习了Git托管代码和写博客。通过Git,我了解了代码不只是写完保存在自己电脑里,还可以进行版本管理和上传托管。这样以后修改代码、保存不同版本、查看自己的学习过程都会更方便。写博客也让我有了整理知识的习惯。以前学完一个知识点可能就过去了,但写博客时需要把自己学到的内容重新梳理一遍,用自己的话表达出来,这个过程其实也是一次复习。
通过这门课,我学到的不只是Python的语法,更重要的是解决问题的思路。写程序时不能只想着结果,而是要先分析步骤,再把每一步用代码表达出来。在学习过程中,我也经常遇到报错,比如缩进错误、变量名写错、逻辑不对等。刚开始我会觉得很烦,但后来慢慢明白,改错和调试也是学习编程的一部分。
对于这门课程,我觉得它对初学者来说还是比较有帮助的。课程内容是从基础开始逐步深入的,前面的知识能为后面的学习打基础。对我来说,这门课让我意识到,学习编程不能只靠上课听懂,还需要自己课后多敲代码、多回顾,也要学会记录和总结,把老师讲过的内容真正变成自己的东西。
总的来说,这学期的Python课程主要学习了基础语法、数据类型、输入输出、条件和循环、数据结构、函数、文件操作、模块、socket、Git代码托管以及博客写作等内容。通过这些学习,我对Python有了初步掌握,也对编程有了新的认识。虽然现在我写代码还不够熟练,但我觉得自己已经能够用Python解决一些简单问题。以后我也会继续多练习,把这学期学到的内容真正巩固下来。

posted @ 2026-06-01 15:45  水滴洋葱  阅读(47)  评论(0)    收藏  举报