尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Python学生成绩数据分析可视化工具(Tkinter+Pandas+Matplotlib)完整源码

Python学生成绩数据分析可视化工具(Tkinter+Pandas+Matplotlib)完整源码 一、项目简介本项目是一款基于Python Tkinter Pandas Matplotlib开发的桌面端学生成绩数据分析可视化工具无需复杂部署开箱即用。支持导入 Excel、CSV 成绩文件自动完成成绩统计分析、多维度可视化绘图、报告导出、历史数据存档等功能。工具适配教师、班委、教学管理人员日常成绩统计场景完美解决传统 Excel 手动统计繁琐、图表制作困难、数据无存档的痛点适合 Python 课程设计、毕设练手、教学辅助工具开发。核心功能亮点✅ 支持Excel(xlsx/xls)、CSV通用成绩文件导入✅ 自动识别分数字段无需手动配置列名✅ 全自动成绩数据分析平均分、最值、标准差、及格率、优秀率✅ 智能分数段统计0-59、60-79、80-100 三段分级✅ 四合一可视化图表柱状图、饼图、直方图、横向对比图✅ 一键导出 TXT 结构化分析报告✅ 成绩数据本地历史存档方便回溯对比✅ 可视化GUI界面操作简单零基础上手✅ 自动中文适配解决 Matplotlib 乱码问题二、开发环境与依赖2.1 运行环境Python 3.7 及以上版本Windows / Mac / Linux 全平台兼容2.2 第三方库依赖执行以下命令批量安装依赖pip install pandas numpy matplotlib openpyxl xlrd依赖说明tkinterPython内置GUI界面库无需额外安装pandas数据读取、清洗、统计分析核心库numpy数值计算、数据处理matplotlib数据可视化绘图openpyxl/xlrd支持Excel文件读写三、软件功能详细介绍3.1 数据导入与预览支持导入主流的 Excel、CSV 成绩表格文件自动去除空行脏数据左侧表格实时预览数据内容最多预览150行数据清晰查看原始成绩信息。程序智能识别包含「分数、成绩、总分、得分」的字段作为统计列适配任意规范表头。3.2 全自动数据分析一键执行数据分析自动生成完整统计报告包含基础数据有效学生人数、平均分、最高分、最低分、分数标准差达标统计及格人数、及格率、优秀人数、优秀率60分及格、80分优秀分段统计不及格、中等、优秀三个分数段人数分布3.3 多维可视化图表生成一键生成2×2四合一专业分析图表自动保存本地包含分数段人数柱状图直观展示各分数段人数差异及格率饼图可视化整体及格、不及格占比成绩分布直方图查看班级成绩集中区间与分布趋势分数段横向对比图横向对比各层级人数3.4 报告导出与数据存档支持一键将分析报告导出为 TXT 文档方便存档、打印、汇报使用支持将本次成绩数据保存至历史记录文件夹按时间命名方便多次考试成绩对比分析四、项目完整源码直接复制以下代码新建score_analysis.py文件即可运行import tkinter as tk from tkinter import ttk, filedialog, messagebox, scrolledtext import pandas as pd import numpy as np import matplotlib.pyplot as plt import os from datetime import datetime import warnings warnings.filterwarnings(ignore) # ---------------------- 全局配置 ---------------------- plt.rcParams[font.family] [SimHei, WenQuanYi Micro Hei, Heiti TC] plt.rcParams[axes.unicode_minus] False OUTPUT_DIR output HISTORY_DIR scores_history os.makedirs(OUTPUT_DIR, exist_okTrue) os.makedirs(HISTORY_DIR, exist_okTrue) class ScoreAnalysisTool: def __init__(self, root): self.root root self.root.title(学生考试成绩数据分析可视化工具) self.root.geometry(1100x720) # 全局变量 self.df None self.file_path None self.report_text self.create_widgets() def create_widgets(self): # 顶部操作栏 top_frame ttk.Frame(self.root, padding8) top_frame.pack(filltk.X) ttk.Button(top_frame, text导入Excel/CSV成绩文件, commandself.load_file).pack(sidetk.LEFT, padx5) ttk.Button(top_frame, text执行数据分析, commandself.run_analysis).pack(sidetk.LEFT, padx5) ttk.Button(top_frame, text生成可视化图表, commandself.draw_charts).pack(sidetk.LEFT, padx5) ttk.Button(top_frame, text导出分析报告, commandself.export_report).pack(sidetk.LEFT, padx5) ttk.Button(top_frame, text保存本次成绩至历史记录, commandself.save_history).pack(sidetk.LEFT, padx5) # 分割左右布局 main_pane ttk.PanedWindow(self.root, orienttk.HORIZONTAL) main_pane.pack(filltk.BOTH, expandTrue, padx8, pady8) # 左侧数据预览表格 left_frame ttk.Frame(main_pane) main_pane.add(left_frame, weight3) ttk.Label(left_frame, text数据预览, font(微软雅黑,11,bold)).pack(anchorw) self.table ttk.Treeview(left_frame, columns[], showheadings) scroll_y ttk.Scrollbar(left_frame, orienttk.VERTICAL, commandself.table.yview) self.table.configure(yscrollcommandscroll_y.set) self.table.pack(sidetk.LEFT, filltk.BOTH, expandTrue) scroll_y.pack(sidetk.RIGHT, filltk.Y) # 右侧分析报告文本框 right_frame ttk.Frame(main_pane) main_pane.add(right_frame, weight2) ttk.Label(right_frame, text分析报告, font(微软雅黑,11,bold)).pack(anchorw) self.text_area scrolledtext.ScrolledText(right_frame) self.text_area.pack(filltk.BOTH, expandTrue) def load_file(self): 加载Excel/CSV成绩文件 path filedialog.askopenfilename( filetypes[(Excel文件, *.xlsx;*.xls), (CSV文件, *.csv), (所有文件, *.*)] ) if not path: return self.file_path path try: if path.endswith(.csv): self.df pd.read_csv(path) else: self.df pd.read_excel(path) # 简单清洗去除空行 self.df self.df.dropna(howall) self.refresh_table() messagebox.showinfo(成功, f数据加载完成共{len(self.df)}条学生记录) except Exception as e: messagebox.showerror(读取失败, str(e)) def refresh_table(self): 刷新预览表格 # 清空旧数据 for item in self.table.get_children(): self.table.delete(item) self.table[columns] list(self.df.columns) for col in self.df.columns: self.table.heading(col, textstr(col)) self.table.column(col, width100) # 插入前150行预览 for _, row in self.df.head(150).iterrows(): self.table.insert(, tk.END, valueslist(row)) def run_analysis(self): 核心统计分析 if self.df is None: messagebox.showwarning(提示, 请先导入成绩文件) return self.text_area.delete(1.0, tk.END) self.report_text # 自动识别分数列匹配包含“分数/成绩/总分”字段 score_cols [c for c in self.df.columns if any(k in str(c).lower() for k in [分数,成绩,总分,得分])] if not score_cols: messagebox.showerror(错误, 未找到分数列请确保表头包含分数/总分/成绩) return score_col score_cols[0] scores pd.to_numeric(self.df[score_col], errorscoerce).dropna() # 基础指标 total_count len(scores) avg_score round(scores.mean(),2) max_score scores.max() min_score scores.min() std_score round(scores.std(),2) pass_line 60 good_line 80 pass_num len(scores[scores pass_line]) good_num len(scores[scores good_line]) pass_rate round(pass_num / total_count *100,2) good_rate round(good_num / total_count *100,2) # 分数段统计 seg_0_60 len(scores[(scores 0) (scores 60)]) seg_60_80 len(scores[(scores 60) (scores 80)]) seg_80_100 len(scores[scores 80]) now datetime.now().strftime(%Y-%m-%d %H:%M:%S) report f 学生成绩分析报告 分析时间{now} 数据源文件{os.path.basename(self.file_path)} 有效学生总数{total_count}人 【整体概况】 平均分{avg_score} 最高分{max_score} 最低分{min_score} 分数标准差{std_score} 【达标情况】 及格线≥60人数{pass_num} 及格率{pass_rate}% 优秀线≥80人数{good_num} 优秀率{good_rate}% 【分数段分布】 059分{seg_0_60}人 6079分{seg_60_80}人 80100分{seg_80_100}人 self.report_text report self.text_area.insert(tk.END, report) def draw_charts(self): 绘制多张可视化图表 if self.df is None or len(self.report_text)0: messagebox.showwarning(提示, 请先导入数据并执行【数据分析】) return score_cols [c for c in self.df.columns if any(k in str(c).lower() for k in [分数,成绩,总分,得分])] score_col score_cols[0] scores pd.to_numeric(self.df[score_col], errorscoerce).dropna() fig, axes plt.subplots(2,2, figsize(14,10)) fig.suptitle(班级考试成绩可视化分析图表, fontsize15) # 1.分数段柱状图 seg_names [0-59,60-79,80-100] seg_data [ len(scores[(scores 0) (scores 60)]), len(scores[(scores 60) (scores 80)]), len(scores[(scores 80)]) ] axes[0,0].bar(seg_names, seg_data, color[#e74c3c,#f39c12,#27ae60]) axes[0,0].set_title(分数段人数分布柱状图) axes[0,0].set_ylabel(人数) # 2.及格/不及格饼图 pass_cnt len(scores[scores60]) fail_cnt len(scores[scores60]) axes[0,1].pie([pass_cnt,fail_cnt], labels[及格,不及格], autopct%.2f%%, colors[#2ecc71,#e74c3c]) axes[0,1].set_title(及格占比饼图) #3.成绩分布直方图 axes[1,0].hist(scores, bins12, color#3498db, alpha0.7) axes[1,0].set_title(成绩分布直方图) axes[1,0].set_xlabel(分数) axes[1,0].set_ylabel(人数) #4.优秀/中等/不及格横向条形 axes[1,1].barh(seg_names, seg_data, color[#e74c3c,#f39c12,#27ae60]) axes[1,1].set_title(分数段横向对比图) plt.tight_layout() save_path os.path.join(OUTPUT_DIR, f成绩图表_{datetime.now().strftime(%Y%m%d_%H%M%S)}.png) plt.savefig(save_path, dpi150, bbox_inchestight) plt.show() messagebox.showinfo(绘图完成, f图表已保存至{save_path}) def export_report(self): 导出文本报告 if len(self.report_text) 0: messagebox.showwarning(提示, 请先执行数据分析) return save_path filedialog.asksaveasfilename( defaultextension.txt, filetypes[(文本文件,*.txt),(所有文件,*.*)], initialfile成绩分析报告.txt ) if save_path: with open(save_path,w,encodingutf-8) as f: f.write(self.report_text) messagebox.showinfo(导出成功, f报告保存至{save_path}) def save_history(self): 保存当前成绩进入历史文件夹 if self.df is None: messagebox.showwarning(提示, 请先导入成绩数据) return save_name f历史成绩_{datetime.now().strftime(%Y%m%d_%H%M%S)}.xlsx save_path os.path.join(HISTORY_DIR, save_name) self.df.to_excel(save_path, indexFalse) messagebox.showinfo(保存成功, f已存入历史记录{save_name}) if __name__ __main__: root tk.Tk() app ScoreAnalysisTool(root) root.mainloop()五、运行教程步骤1安装依赖库打开CMD或PyCharm终端执行依赖安装命令pip install pandas numpy matplotlib openpyxl xlrd步骤2准备成绩文件新建 Excel / CSV 文件表格中必须包含分数、总分、成绩等关键字段程序可自动识别统计列。步骤3运行程序直接运行Python脚本自动弹出GUI窗口操作流程 1、导入成绩文件 → 2、执行数据分析 → 3、生成可视化图表 → 4、导出报告/保存历史数据。步骤4文件输出说明output文件夹自动保存生成的可视化图表图片scores_history文件夹存放所有存档的历史成绩表格六、项目总结本成绩数据分析工具功能完整、界面简洁、实用性极强完美实现了数据导入、智能分析、可视化绘图、报告导出、数据存档全流程功能。代码结构清晰、注释规范、易于二次开发可拓展多科目分析、班级对比、成绩预测、数据筛选等功能。适合作为Python课程设计、期末大作业、小型桌面软件开发实训、教学辅助工具使用零基础可直接运行部署。七、拓展方向可自行二次开发增加多科目成绩独立分析功能添加成绩排名、升降序筛选增加历史成绩对比分析功能支持自定义及格线、优秀线分数新增PDF报告导出功能
返回列表