import tkinter as tk
from tkinter import ttk, messagebox
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 模拟学生成绩数据 科目：语文 数学 英语 物理 化学
score_data = {
    "张三": [85, 92, 78, 88, 90],
    "李四": [72, 80, 85, 75, 82],
    "王五": [90, 86, 93, 89, 95],
    "赵六": [65, 70, 68, 72, 76],
    "陈七": [88, 85, 91, 87, 83]
}
subjects = ["语文", "数学", "英语", "物理", "化学"]

class ScoreTrendApp:
    def __init__(self, root):
        self.root = root
        self.root.title("成绩走势图")
        self.root.geometry("850x550")
        self.root.resizable(False, False)

        # 顶部输入区域
        top_frame = ttk.Frame(root, padding=15)
        top_frame.pack(fill=tk.X)

        ttk.Label(top_frame, text="输入学生姓名：", font=("微软雅黑",12)).pack(side=tk.LEFT,padx=5)
        self.name_entry = ttk.Entry(top_frame, font=("微软雅黑",12), width=15)
        self.name_entry.pack(side=tk.LEFT,padx=5)
        self.name_entry.focus()

        ttk.Button(top_frame, text="生成成绩走势", command=self.draw_score).pack(side=tk.LEFT,padx=10)
        ttk.Button(top_frame, text="清空图表", command=self.clear_pic).pack(side=tk.LEFT)

        # 绘图区域
        chart_frame = ttk.Frame(root)
        chart_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)

        self.fig, self.ax = plt.subplots(figsize=(7,4.5), dpi=100)
        self.canvas = None

    def draw_score(self):
        name = self.name_entry.get().strip()
        if not name:
            messagebox.showwarning("提示","请输入学生姓名")
            return
        if name not in score_data:
            messagebox.showerror("错误","暂无该学生成绩数据！\n可用：张三、李四、王五、赵六、陈七")
            return
        
        self.ax.clear()
        scores = score_data[name]
        # 绘制折线图
        self.ax.plot(subjects, scores, marker='o', linewidth=2, color='#1f77b4', markersize=7)
        # 标注分数
        for x,y in zip(subjects,scores):
            self.ax.text(x,y+1,str(y),ha="center",fontsize=10)
        
        self.ax.set_title(f"{name}各科成绩走势图", fontsize=14)
        self.ax.set_ylabel("分数")
        self.ax.set_ylim(50,100)
        self.ax.grid(True, alpha=0.3)

        if self.canvas:
            self.canvas.get_tk_widget().destroy()
        self.canvas = FigureCanvasTkAgg(self.fig, master=self.root)
        self.canvas.draw()
        self.canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True, padx=15)

    def clear_pic(self):
        self.name_entry.delete(0,tk.END)
        self.ax.clear()
        if self.canvas:
            self.canvas.get_tk_widget().destroy()
            self.canvas = None

if __name__ == "__main__":
    win = tk.Tk()
    app = ScoreTrendApp(win)
    win.mainloop()