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

class ScoreApp:
    def __init__(self, root):
        self.root = root
        self.root.title("成绩走势分析工具")
        self.scores = []

        # --- 界面布局 ---
        # 左侧控制区
        left_frame = tk.Frame(root, padx=10, pady=10)
        left_frame.pack(side=tk.LEFT, fill=tk.Y)

        tk.Label(left_frame, text="输入成绩 (0-100):").pack()
        self.entry = tk.Entry(left_frame)
        self.entry.pack(pady=5)
        self.entry.bind('<Return>', lambda e: self.add_score()) # 支持回车

        tk.Button(left_frame, text="添加成绩", command=self.add_score, bg="#4CAF50", fg="white").pack(fill=tk.X, pady=2)
        tk.Button(left_frame, text="删除最后一条", command=self.delete_last).pack(fill=tk.X, pady=2)
        tk.Button(left_frame, text="清空全部", command=self.clear_all).pack(fill=tk.X, pady=2)

        tk.Label(left_frame, text="历史记录:").pack(pady=(10, 0))
        self.listbox = tk.Listbox(left_frame, width=20)
        self.listbox.pack(fill=tk.BOTH, expand=True)

        # 右侧图表区
        self.right_frame = tk.Frame(root)
        self.right_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True)
        
        # 初始化Matplotlib图表
        self.fig, self.ax = plt.subplots(figsize=(5, 4), dpi=100)
        # 解决中文显示问题
        plt.rcParams['font.sans-serif'] = ['SimHei'] 
        plt.rcParams['axes.unicode_minus'] = False
        
        self.canvas = FigureCanvasTkAgg(self.fig, master=self.right_frame)
        self.canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True)

    def add_score(self):
        val = self.entry.get()
        try:
            score = float(val)
            if 0 <= score <= 100:
                self.scores.append(score)
                self.listbox.insert(tk.END, f"第{len(self.scores)}次: {score}")
                self.entry.delete(0, tk.END)
                self.plot_data()
            else:
                messagebox.showwarning("错误", "请输入0-100之间的数字")
        except ValueError:
            messagebox.showerror("错误", "请输入有效的数字")

    def delete_last(self):
        if self.scores:
            self.scores.pop()
            self.listbox.delete(tk.END)
            self.plot_data()

    def clear_all(self):
        if messagebox.askyesno("确认", "确定要清空所有数据吗？"):
            self.scores = []
            self.listbox.delete(0, tk.END)
            self.plot_data()

    def plot_data(self):
        self.ax.clear()
        if self.scores:
            x = range(1, len(self.scores) + 1)
            self.ax.plot(x, self.scores, marker='o', color='#1f77b4', linewidth=2)
            # 标注数值
            for i, v in enumerate(self.scores):
                self.ax.text(i+1, v + 1, str(v), ha='center')
            
            self.ax.set_title("成绩走势图")
            self.ax.set_xlabel("考试次数")
            self.ax.set_ylabel("分数")
            self.ax.set_ylim(0, 110)
            self.ax.grid(True, linestyle='--', alpha=0.6)
        
        self.canvas.draw()

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