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 ScoreChartApp:
    def __init__(self, root):
        self.root = root
        self.root.title("成绩走势图")
        self.root.geometry("800x600")

        # 存储数据
        self.subject_list = []
        self.score_list = []

        # 上方输入区域
        frame_input = ttk.Frame(root, padding=10)
        frame_input.pack(fill=tk.X)

        ttk.Label(frame_input, text="科目：").grid(row=0, column=0, padx=5)
        self.var_subject = tk.StringVar()
        ttk.Entry(frame_input, textvariable=self.var_subject, width=12).grid(row=0, column=1, padx=5)

        ttk.Label(frame_input, text="分数：").grid(row=0, column=2, padx=5)
        self.var_score = tk.StringVar()
        ttk.Entry(frame_input, textvariable=self.var_score, width=12).grid(row=0, column=3, padx=5)

        ttk.Button(frame_input, text="添加成绩", command=self.add_score).grid(row=0, column=4, padx=8)
        ttk.Button(frame_input, text="绘制走势图", command=self.draw_chart).grid(row=0, column=5, padx=5)
        ttk.Button(frame_input, text="清空所有", command=self.clear_all).grid(row=0, column=6, padx=5)

        # 列表展示区域
        frame_list = ttk.Frame(root, padding=5)
        frame_list.pack(fill=tk.X)
        self.text_info = tk.Text(frame_list, height=4)
        self.text_info.pack(fill=tk.X)

        # 绘图容器
        self.fig, self.ax = plt.subplots(figsize=(9, 5), dpi=90)
        self.canvas = FigureCanvasTkAgg(self.fig, master=self.root)
        self.canvas_widget = self.canvas.get_tk_widget()
        self.canvas_widget.pack(fill=tk.BOTH, expand=True, padx=10, pady=5)

    def add_score(self):
        """添加科目和分数"""
        sub = self.var_subject.get().strip()
        scr_text = self.var_score.get().strip()
        if not sub or not scr_text:
            messagebox.showwarning("提示", "科目和分数不能为空！")
            return
        try:
            score = float(scr_text)
            if not (0 <= score <= 100):
                messagebox.showwarning("提示", "分数范围0~100！")
                return
        except ValueError:
            messagebox.showerror("错误", "分数必须是数字！")
            return

        self.subject_list.append(sub)
        self.score_list.append(score)
        self.text_info.insert(tk.END, f"科目:{sub} 分数:{score}\n")
        # 清空输入框
        self.var_subject.set("")
        self.var_score.set("")

    def draw_chart(self):
        """绘制折线走势图"""
        if len(self.subject_list) == 0:
            messagebox.showinfo("提示", "请先录入成绩！")
            return
        self.ax.clear()
        # 绘制折线+标记点
        self.ax.plot(self.subject_list, self.score_list, marker="o", color="#2E86AB", linewidth=2, markersize=7)
        self.ax.set_title("成绩走势折线图", fontsize=14)
        self.ax.set_xlabel("科目/考试批次", fontsize=11)
        self.ax.set_ylabel("分数", fontsize=11)
        self.ax.set_ylim(0, 105)
        self.ax.grid(True, alpha=0.35)
        self.canvas.draw()

    def clear_all(self):
        """清空数据和图像"""
        self.subject_list.clear()
        self.score_list.clear()
        self.text_info.delete(1.0, tk.END)
        self.ax.clear()
        self.canvas.draw()

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