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

# 设置matplotlib中文
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
plt.rcParams["axes.unicode_minus"] = False


class ScoreTrendGUI:
    def __init__(self, root):
        self.root = root
        self.root.title("成绩走势分析图")
        self.root.geometry("900x650")

        # 存储数据
        self.exam_names = []  # 考试名称：第一次月考、期中...
        self.score_data = {}  # {科目:[分数列表]}

        # 构建界面布局
        self.create_widgets()
        # 初始化画布
        self.init_plot()

    def create_widgets(self):
        # 左侧输入面板
        frame_left = tk.Frame(self.root, padx=10, pady=10)
        frame_left.pack(side=tk.LEFT, fill=tk.Y)

        # 考试名称
        ttk.Label(frame_left, text="考试名称:").pack(anchor="w")
        self.var_exam = ttk.Entry(frame_left, width=18)
        self.var_exam.pack(pady=(0, 8))

        # 科目
        ttk.Label(frame_left, text="科目名称:").pack(anchor="w")
        self.var_subject = ttk.Entry(frame_left, width=18)
        self.var_subject.pack(pady=(0, 8))

        # 分数
        ttk.Label(frame_left, text="本次分数:").pack(anchor="w")
        self.var_score = ttk.Entry(frame_left, width=18)
        self.var_score.pack(pady=(0, 12))

        # 按钮组
        ttk.Button(frame_left, text="添加成绩", command=self.add_score).pack(fill=tk.X, pady=3)
        ttk.Button(frame_left, text="刷新走势图", command=self.draw_chart).pack(fill=tk.X, pady=3)
        ttk.Button(frame_left, text="清空所有数据", command=self.clear_all).pack(fill=tk.X, pady=3)

        # 右侧绘图区域
        self.frame_plot = tk.Frame(self.root)
        self.frame_plot.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True, padx=5, pady=5)

    def init_plot(self):
        self.fig, self.ax = plt.subplots(figsize=(7, 5), dpi=100)
        self.canvas = FigureCanvasTkAgg(self.fig, master=self.frame_plot)
        self.canvas_widget = self.canvas.get_tk_widget()
        self.canvas_widget.pack(fill=tk.BOTH, expand=True)
        self.draw_chart()

    def add_score(self):
        exam = self.var_exam.get().strip()
        subj = self.var_subject.get().strip()
        score_str = self.var_score.get().strip()

        if not exam or not subj or not score_str:
            messagebox.showwarning("提示", "名称和分数不能为空！")
            return
        try:
            score = float(score_str)
        except ValueError:
            messagebox.showerror("错误", "分数必须是数字！")
            return

        # 新增考试节点
        if exam not in self.exam_names:
            self.exam_names.append(exam)
        # 科目初始化列表
        if subj not in self.score_data:
            self.score_data[subj] = [None] * len(self.exam_names)
        # 补齐长度（防止长度不一致）
        while len(self.score_data[subj]) < len(self.exam_names):
            self.score_data[subj].append(None)
        idx = self.exam_names.index(exam)
        self.score_data[subj][idx] = score

        # 清空输入框
        self.var_exam.delete(0, tk.END)
        self.var_subject.delete(0, tk.END)
        self.var_score.delete(0, tk.END)
        self.draw_chart()

    def draw_chart(self):
        self.ax.clear()
        subjects = list(self.score_data.keys())
        colors = ["#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", "#8c564b"]

        for i, subj in enumerate(subjects):
            scores = self.score_data[subj]
            self.ax.plot(self.exam_names, scores, marker="o", label=subj, color=colors[i % len(colors)])

        self.ax.set_title("各科成绩走势折线图")
        self.ax.set_xlabel("考试批次")
        self.ax.set_ylabel("分数")
        self.ax.grid(alpha=0.3)
        self.ax.legend()
        self.canvas.draw()

    def clear_all(self):
        self.exam_names.clear()
        self.score_data.clear()
        self.draw_chart()


if __name__ == "__main__":
    window = tk.Tk()
    app = ScoreTrendGUI(window)
    window.mainloop()