20251202马思钊 实验四 Python综合实践实验报告
课程:《Python程序设计》
班级: 2512
姓名: 马思钊
学号:20251202
实验教师:王志强
实验日期:2026年6月15日
必修/选修: 公选课
代码更新在gitee中:https://gitee.com/w20251202-ma-sizhao/427shiyan/blob/master/251202终实验
一、设计概述
-
实验出发点
移动支付已经这么普及,群众每天花钱、收钱的记录越来越多,但很多记账软件只是简单记录,没有适合观看的可视化图表。于是我用Python做个较智能的系统,既能处理本地数据,又能通过图表看懂自己的消费习惯,以及预测未来的花销。同时运用Python在数据处理、做图形界面(GUI)和用算法预测方面的能力。所以设计了智能个人财务与消费行为分析系统,希望能把零散的账单变成有用的信息,帮助用户更好地理财。
注:实验数据均为虚构,于自己及周围人群的实际生活经历无关。 -
实验分析
· 学习GUI编程: 使用 tkinter 库构建用户交互界面。
· 数据处理能力:运用 pandas 库进行复杂的数据分组与统计分析。
· 数据可视化:使用 matplotlib 将抽象的财务数据转化为直观的图表(饼图、折线图)。
· 算法应用:结合简单的数学模型思想(如线性回归)进行趋势预测。
· 实践从需求分析、代码实现到版本控制(Git/Gitee)的完整软件开发流程。 -
实验设计
功能模块主要包含以下五项
1.数据管理(Data Management):
支持手动录入收支明细(日期、类别、金额、备注)。
支持批量导入 CSV/Excel 历史数据。
提供数据的增删改查(CRUD)功能。
2.统计分析(Statistical Analysis):
按“支出类别”统计占比(如餐饮、交通、娱乐)。
按“时间维度”(月/周)统计收支趋势。
3.可视化展示(Visualization):
动态生成饼状图展示消费结构。
生成折线图展示资金流动趋势。
4.智能预测(Smart Prediction):
设定月度预算阈值,超支自动预警。
基于历史数据,利用简单线性回归算法预测下月支出趋势。
5.报表导出(Export):
将当前分析结果一键导出为 Excel 报表,便于存档。
二、关键代码的实现与说明
这份代码是一个完整的 "智能个人财务分析系统" 桌面应用。它结合了 tkinter(界面)、pandas(数据处理)和 matplotlib(可视化)
- 基础配置

这里导入了所有必要的库。
os, json, csv:用于文件和路径操作。
random, datetime:用于生成模拟数据。
tkinter 及其子模块:构建图形用户界面(GUI)。
pandas:核心数据处理引擎。
matplotlib 及 FigureCanvasTkAgg:用于在 Tkinter 窗口中嵌入图表。

这是 Matplotlib 绘图的前置代码。
SimHei (黑体) 是 Windows 下常用的中文字体,Arial Unicode MS 是 Mac/通用备选。
axes.unicode_minus=False 用于解决负号显示为方框的问题。
- 核心数据管理类
这个类负责所有数据的逻辑运算。

构造函数初始化了一个空的 DataFrame,并尝试加载数据。

检查文件是否存在,不存在则调用 save_data 创建新文件。
读取 CSV 后,强制将“日期”列转换为 datetime 类型,确保后续排序和图表 X 轴显示正确。

完成数据写入与添加
save_data:保存时不保存索引 (index=False),保持 CSV 整洁。
add_record:将新数据包装成一个 DataFrame,然后与原数据纵向拼接。

这段是核心的分析方法
get_summary_by_category:使用 groupby 按“分类”聚合,计算每类支出的总和。
get_trend_data:按“日期”分组,计算每日总支出,并按日期排序,用于画折线图。

这是一个纯手工实现的简单线性回归(未使用 sklearn)。
将日期映射为数字索引 (day_index)。
手动编写公式计算斜率 m 和截距 b。
利用 y = mx + b 预测下一点的值。


这是类似于随机数函数的,用于生成50条随机的收支记录,涵盖了常见的消费和收入场景。
用以迅速测试该程序能否正常运行。
- 图形用户界面
这个类负责将数据展示给用户,并接收用户输入。

标准的 Tkinter 初始化,窗口大小设为 900x650,并实例化了 FinanceManager。

通过 ttk.Style 统一设置了按钮和标题的字体(微软雅黑)和大小,提升了界面的美观度。

创建并放置顶部容器框架,添加左侧标题标签,创建右侧按钮组容器,依次添加功能按钮

创建了输入框和下拉框,用于左侧录入。insert(0, ...) 让日期默认显示当天

预设数据类型的五项的分别接收。

右侧展示区,使用了 Notebook 实现了多标签页切换。
Tab 1:使用 ttk.Treeview 创建表格,显示所有明细。
Tab 2:使用 matplotlib 嵌入图表。

嵌入图表,
FigureCanvasTkAgg 是连接 Matplotlib 和 Tkinter 的桥梁。
subplots(1, 2) 创建了一行两列的子图(左边饼图,右边折线图)


处理事件,获取视图数据,调用模型 (manager) 处理,处理成功后更新视图 (refresh, update)。
3. 主函数的入口

临门一脚。
三、运行结果
运行视频如下:https://www.bilibili.com/video/BV1Hsj36CE5Z/?spm_id_from=333.337.search-card.all.click
- 50条随机信息的实验情况
明细列表局部如下:
![image]()
可视化图表如下:

预测结果如下

- 自行输入数据情况
![image]()
败家子情况:
![image]()
![image]()
四、项目的亮点与特色
1.桌面GUI应用开发能力
摒弃了简单的命令行交互,使用 tkinter 构建了完整的图形用户界面。
实现了多窗口管理(主窗口+子窗口)、事件驱动编程(按钮点击回调)、以及复杂的布局管理(Grid/Pack 混合布局)。这证明了你具备开发独立桌面软件的思维。
2.嵌入数据可视化技术
解决了 Matplotlib 图表无法直接在 Tkinter 中显示的问题。
使用了 FigureCanvasTkAgg 适配器,将 Matplotlib 的绘图对象“嵌入”到 Tkinter 的 Canvas 组件中。这是 Python GUI 开发中的一个经典难点,掌握它说明你对底层绘图机制有深入理解。
3.结构化的数据处理流程
不仅仅是读写文件,而是引入了 Pandas 进行内存级数据分析。
利用 DataFrame 进行数据的分组聚合(GroupBy)、透视表分析(Pivot Table)和时间序列处理。这种“数据加载 -> 内存计算 -> 结果渲染”的模式是标准的数据工程范式。
4. 异常处理与用户体验优化
代码中包含了较为完善的容错机制。
设置了中文字体防乱码配置,使用了 messagebox 进行错误提示(如文件格式错误、空数据警告),防止程序因用户误操作而崩溃(Crash)。
五、遇到的问题和不足
1.中文乱码问题:
问题描述: 在使用 Matplotlib 绘图时,标题和标签中的中文显示为方框。
解决方案: 在代码开头添加了字体配置代码 plt.rcParams['font.sans-serif'] = ['SimHei'],成功解决了中文显示问题。
2.GUI 卡顿问题:
问题描述: 当数据量较大时,点击“分析”按钮会导致界面短暂假死。
解决方案: 初步分析了原因,是因为数据处理在主线程中进行。虽然改后未引入多线程,但通过优化 Pandas 的查询语句减少了计算耗时。
不足之处:仍存在不少的代码严谨性纰漏,pycharm给出了不少的警告。

该程序在运行过程中最大的不适应在于无法删除已录入信息,以及无法录入多个用户的不同信息。
可扩展方向
- 引入机器学习/预测算法
预算预警: 根据过去 3 个月的平均支出,利用线性回归预测本月总支出。如果预测值超过设定预算,自动弹出红色警告。
异常检测: 识别异常消费行为(例如:某笔支出远超历史平均值),并在界面上高亮标记。 - 数据持久化升级
CSV 文件适合小数据,但容易出错且效率低。
SQLite 集成: 使用 Python 内置的 sqlite3 库替换 CSV 存储。实现真正的关系型数据库查询(SQL),支持更复杂的多表关联(如:用户表、账单表、分类表)。
ORM 框架: 尝试使用 SQLAlchemy,体验工业级的数据库开发模式。 - 智能化与自动化
OCR 票据识别: 接入百度 AI 或腾讯云 API,实现“拍照记账”。用户上传发票截图,系统自动提取金额、日期和商家信息填入表格。
定时任务: 使用 schedule 库,实现每周五下午 5 点自动生成周报并发送邮件给自己。 - 界面现代化改造
Tkinter 原生界面略显老旧,可以尝试以下升级:
换肤框架: 引入 ttkbootstrap 或 CustomTkinter 库,只需修改几行代码,就能获得类似 Windows 11 或 macOS 风格的现代化 UI(圆角按钮、深色模式)。
Web 化转型: 如果觉得 Tkinter 上限太低,可以尝试用 Streamlit 或 Flask 重写前端,将其变成一个可以在浏览器访问的 Web 应用。 - 增加数据导出功能
生成 PDF 报告: 使用 reportlab 库,一键生成包含图表和分析结论的月度财务报告。
Excel 格式化导出: 导出的 Excel 不再是纯数据,而是带有颜色标记、自动求和公式的专业报表。
六、结课感悟
python课结束的好快,或许是拜时间流速过快所赐吧。当初选python一是为了在C语言之外想再探探新思路,二是学长学姐们的强力推荐。既想要学习这个知名度极高的编程语言,又想看看老师究竟有多好。老师肯定是非常好,听课听的几乎没有紧张感,甚为平易。
我记得最深的点就是开课讲到的“python是面向对象的语言”“python是高级语言”,以及那些列表元组字典集合的异同点,还有从切片遍历到正则爬虫之流。学习python课肯定首先带给我的编程技术的提升,能让我在C语言之外看到不同的语法,不同的思考方式,开辟并学习了一项全新的技术,不论学艺是否十分精湛,也肯定不枉这一个学期的周一晚上了。
这门课最与众不同两个点就是英语单词打卡和奇怪的手势签到吧。可惜我没能坚持打卡,断掉许多天数。又经历了一遍时间跨度较长的“三分钟热度”,我只坚持了一个多月,就开始间歇性的忘记这件事情。最后零零散散凑了60天,远远被其他同学甩开了。课上的手势签到倒是解起来特别顺溜,自第一次见个新鲜,第二次及之后就找到了思路,也算是梦回小学奥数了,再做做脑筋急转弯。
王老师自身的实力也肯定是高强,同时居然还有一批眼线,我认为这令无数老师望尘莫及。老师选的这个教室也是十分有眼光,能让众人被从外面监管上,甚至依然有不少作死的同学。王老师在最后一节课也为我们灌了该灌的鸡汤,听这份鸡汤的舒适感尤其浓厚,真的感觉到老师朴素挚切的愿望(或许是朴素吧)。可惜倒数第二节的抢问题环节,我的手速实在是望尘莫及,多次擦边有希望却也从来没有被叫到过,实在是令我痛心。
这一个学期下来确实没什么意见。建议嘛,既然老师说学长们都建议多给下一届留作业,那么臣附议。可以适时挑选一个良辰吉日来一个不扣分只加分的集体小测之类的活动,这样或多或少也能调动一部分有余力的同学主动去复习python相关的内容,或多或少也能减少一些同学们玩不知名小游戏的时长,只是我不确定这会不会对老师的名声之根基产生动摇,望老师斟酌。
最后祝王老师工作顺利,身体健康,长生不老,桃李满电科院。




