import tkinter as tk
from tkinter import 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

class GradeTracker:
    def __init__(self, root):
        self.root = root
        self.root.title("学生成绩走势分析器")
        self.root.geometry("900x500")

        # 数据存储
        self.subjects = ["第一次", "第二次", "第三次", "第四次", "第五次"]
        self.scores = [85, 88, 82, 92, 95]

        # --- 左侧控制面板 ---
        self.left_frame = tk.Frame(root, width=250, padx=20, pady=20)
        self.left_frame.pack(side="left", fill="y")

        tk.Label(self.left_frame, text="添加新成绩", font=("微软雅黑", 12, "bold")).pack(pady=10)
        
        tk.Label(self.left_frame, text="考试/科目名称:").pack()
        self.sub_entry = tk.Entry(self.left_frame)
        self.sub_entry.pack(pady=5)
        self.sub_entry.insert(0, "第六次")

        tk.Label(self.left_frame, text="分数 (0-100):").pack()
        self.score_entry = tk.Entry(self.left_frame)
        self.score_entry.pack(pady=5)

        self.add_btn = tk.Button(self.left_frame, text="更新走势图", command=self.add_data, 
                                 bg="#4CAF50", fg="white", font=("微软雅黑", 10))
        self.add_btn.pack(pady=20, fill="x")

        self.clear_btn = tk.Button(self.left_frame, text="清空数据", command=self.clear_data)
        self.clear_btn.pack(fill="x")

        # --- 右侧图表显示 ---
        self.right_frame = tk.Frame(root, bg="white")
        self.right_frame.pack(side="right", expand=True, fill="both")

        self.fig, self.ax = plt.subplots(figsize=(6, 4), dpi=100)
        self.canvas = FigureCanvasTkAgg(self.fig, master=self.right_frame)
        self.canvas.get_tk_widget().pack(side="top", fill="both", expand=1)

        self.update_chart()

    def add_data(self):
        sub = self.sub_entry.get()
        score = self.score_entry.get()

        if not sub or not score:
            messagebox.showwarning("错误", "请输入完整信息")
            return

        try:
            score_val = float(score)
            if 0 <= score_val <= 100:
                self.subjects.append(sub)
                self.scores.append(score_val)
                self.update_chart()
                self.score_entry.delete(0, tk.END)
            else:
                messagebox.showerror("错误", "分数必须在0-100之间")
        except ValueError:
            messagebox.showerror("错误", "请输入有效的数字分数")

    def clear_data(self):
        self.subjects = []
        self.scores = []
        self.update_chart()

    def update_chart(self):
        # 清除旧图表
        self.ax.clear()

        if not self.scores:
            self.ax.text(0.5, 0.5, "暂无数据", ha='center')
        else:
            # 绘制折线图
            self.ax.plot(self.subjects, self.scores, marker='o', linestyle='-', color='#2196F3', linewidth=2, label="得分")
            
            # 绘制平均分虚线
            avg_score = sum(self.scores) / len(self.scores)
            self.ax.axhline(avg_score, color='red', linestyle='--', alpha=0.5, label=f"平均分:{avg_score:.1f}")

            # 设置标题和标签
            self.ax.set_title("学习成绩波动走势图", fontsize=14)
            self.ax.set_xlabel("考试/科目")
            self.ax.set_ylabel("分数")
            self.ax.set_ylim(0, 110) # 固定y轴范围
            self.ax.grid(True, linestyle=':', alpha=0.6)
            self.ax.legend()

            # 在点上标注数值
            for i, txt in enumerate(self.scores):
                self.ax.annotate(txt, (self.subjects[i], self.scores[i]), textcoords="offset points", xytext=(0,10), ha='center')

        self.fig.tight_layout()
        self.canvas.draw()

if __name__ == "__main__":
    root = tk.Tk()
    app = GradeTracker(root)
    root.mainloop()