import pandas as pd import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg import tkinter as tk from tkinter import filedialog from tkinter import ttk from tkinter import messagebox from wordcloud import WordCloud import requests # 读取CSV文件 df = pd.read_csv(r'D:\刘立嘉老师的仓库\PTA _ 程序设计类实验辅助教学平台.csv') # 将提交通过率百分比转换为浮点数 df['提交通过率百分比'] = df['提交通过率百分比'].str.replace(r'[\(\)%]', '', regex=True).astype(float) / 100.0 # 根据题目计算平均通过率 knowledge_points = df.groupby('题目')['提交通过率百分比'].mean().reset_index() knowledge_points = knowledge_points.rename(columns={'提交通过率百分比': '平均通过率百分比'}) # 按照平均通过率降序排序 knowledge_points = knowledge_points.sort_values(by='平均通过率百分比', ascending=False) # 学生掌握情况分析排序 df_sorted = df.sort_values(by='提交通过率百分比', ascending=False) # 设置matplotlib中文字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑体 plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题 # 主界面 class MainApplication(tk.Tk): def __init__(self): super().__init__() self.title("主界面") self.geometry("300x200") self.create_widgets() def create_widgets(self): ttk.Button(self, text="学生答题情况录入", command=self.record_student_answers).pack(pady=10) ttk.Button(self, text="知识点、题目分析及可视化", command=self.show_knowledge_analysis).pack(pady=10) ttk.Button(self, text="学生掌握情况分析及可视化", command=self.show_student_analysis).pack(pady=10) def record_student_answers(self): RecordStudentAnswersWindow(self) def show_knowledge_analysis(self): KnowledgeAnalysisWindow(self) def show_student_analysis(self): StudentAnalysisWindow(self) class RecordStudentAnswersWindow(tk.Toplevel): def __init__(self, parent): super().__init__(parent) self.title("学生答题情况录入") self.geometry("400x200") self.title_label = ttk.Label(self, text="标题:") self.title_label.pack(pady=5) self.title_entry = ttk.Entry(self) self.title_entry.pack(pady=5, padx=20, fill=tk.X) self.score_label = ttk.Label(self, text="分数:") self.score_label.pack(pady=5) self.score_entry = ttk.Entry(self) self.score_entry.pack(pady=5, padx=20, fill=tk.X) self.pass_rate_label = ttk.Label(self, text="提交通过率:") self.pass_rate_label.pack(pady=5) self.pass_rate_entry = ttk.Entry(self) self.pass_rate_entry.pack(pady=5, padx=20, fill=tk.X) ttk.Button(self, text="提交", command=self.submit_answer).pack(pady=10) def submit_answer(self): title = self.title_entry.get() score = self.score_entry.get() pass_rate = self.pass_rate_entry.get() if not title or not score or not pass_rate: messagebox.showerror("错误", "请填写所有字段!") return try: score = float(score) pass_rate = float(pass_rate) # 读取现有的 Excel 文件数据 try: df = pd.read_excel(r'D:\刘立嘉老师的仓库\python大作业\PTA _ 程序设计类实验辅助教学平台C语言.xlsx') except FileNotFoundError: df = pd.DataFrame(columns=['标题', '分数', '提交通过率1']) # 创建新的 DataFrame 并添加到现有 DataFrame 下方 new_row = pd.DataFrame({'标题': [title], '分数': [score], '提交通过率1': [pass_rate]}) df = pd.concat([df, new_row], ignore_index=True) # 将数据写入 Excel 文件 df.to_excel(r'D:\刘立嘉老师的仓库\python大作业\PTA _ 程序设计类实验辅助教学平台C语言.xlsx', index=False) messagebox.showinfo("成功", "答题情况录入成功!") except ValueError: messagebox.showerror("错误", "分数和提交通过率必须为数字!") # 知识点、题目分析窗口 class KnowledgeAnalysisWindow(tk.Toplevel): def __init__(self, parent): super().__init__(parent) self.title("知识点、题目分析及可视化") self.geometry("800x600") self.canvas = None # 初始化canvas为None self.create_widgets() def create_widgets(self): self.start_entry = ttk.Entry(self) self.start_entry.pack(pady=5) self.start_entry.insert(0, "起始题号") self.start_entry.bind("<FocusIn>", self.clear_start_entry) self.end_entry = ttk.Entry(self) self.end_entry.pack(pady=5) self.end_entry.insert(0, "结束题号") self.end_entry.bind("<FocusIn>", self.clear_end_entry) ttk.Button(self, text="显示可视化", command=self.show_visualization).pack(pady=5) self.export_button = ttk.Button(self, text="导出图表", command=self.export_chart) self.export_button.pack(side=tk.BOTTOM, pady=10) self.export_button.pack_forget() # 初始化时隐藏导出按钮 # 添加显示题目词云的按钮 ttk.Button(self, text="显示题目词云", command=self.show_word_cloud).pack(side=tk.BOTTOM, pady=10) def clear_start_entry(self, event): if self.start_entry.get() == "起始题号": self.start_entry.delete(0, tk.END) def clear_end_entry(self, event): if self.end_entry.get() == "结束题号": self.end_entry.delete(0, tk.END) def show_visualization(self): try: start = self.start_entry.get() end = self.end_entry.get() start = int(start) end = int(end) total_questions = len(knowledge_points) if 1 <= start <= total_questions and 1 <= end <= total_questions: self.plot_visualization(start, end) else: messagebox.showerror("错误", "题号范围无效!") except ValueError: messagebox.showerror("错误", "请输入有效的题号!") def plot_visualization(self, start, end): if self.canvas: # 如果已有图表,则先销毁 self.canvas.get_tk_widget().pack_forget() self.canvas.get_tk_widget().destroy() self.canvas = None fig, ax = plt.subplots(figsize=(12, 6)) ax.barh(knowledge_points['题目'].iloc[start-1:end], knowledge_points['平均通过率百分比'].iloc[start-1:end], color='Lavender') ax.set_xlabel('平均通过率') ax.set_ylabel('题目') ax.set_title(f'题目 {start} 到 {end} 的平均通过率') ax.invert_yaxis() ax.grid(axis='x', linestyle='--', alpha=0.7) plt.tight_layout() self.canvas = FigureCanvasTkAgg(fig, master=self) self.canvas.draw() self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=True) self.export_button.pack(side=tk.BOTTOM, pady=10) # 显示导出按钮 def export_chart(self): if self.canvas: file_path = filedialog.asksaveasfilename(defaultextension='.png', filetypes=[("PNG files", '*.png'), ("All files", '*.*')]) if file_path: self.canvas.figure.savefig(file_path) def show_word_cloud(self): text = " ".join(knowledge_points['题目']) # 将题目文本组合成一个长字符串 wordcloud = WordCloud(font_path='simhei.ttf', background_color='white').generate(text) plt.figure(figsize=(8, 6)) plt.imshow(wordcloud, interpolation='bilinear') plt.axis('off') plt.tight_layout() plt.show() # 学生掌握情况分析窗口 class StudentAnalysisWindow(tk.Toplevel): def __init__(self, parent): super().__init__(parent) self.title("学生掌握情况分析及可视化") self.geometry("800x600") self.create_widgets() def create_widgets(self): fig, ax = plt.subplots(figsize=(12, 6)) ax.hist(df['提交通过率百分比'], bins=20, edgecolor='k', color='LightBlue') ax.set_xlabel('通过率百分比') ax.set_ylabel('题目数量') ax.set_title('题目通过率分布') plt.tight_layout() self.canvas = FigureCanvasTkAgg(fig, master=self) self.canvas.draw() self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=True) # 添加显示词云的按钮 ttk.Button(self, text="显示词云", command=self.show_word_cloud).pack(side=tk.BOTTOM, pady=10) # 添加保存图表的按钮 ttk.Button(self, text="导出图表", command=self.export_chart).pack(side=tk.BOTTOM, pady=10) def show_word_cloud(self): text = " ".join(df['题目']) # 从题目列中获取文本 wordcloud = WordCloud(font_path='simhei.ttf', background_color='white').generate(text) plt.figure(figsize=(8, 6)) plt.imshow(wordcloud, interpolation='bilinear') plt.axis('off') plt.tight_layout() plt.show() def export_chart(self): file_path = filedialog.asksaveasfilename(defaultextension='.png', filetypes=[("PNG files", '*.png'), ("All files", '*.*')]) if file_path: self.canvas.figure.savefig(file_path) if __name__ == "__main__": app = MainApplication() app.mainloop()
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现