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

class ScoreChartApp:
    def __init__(self, root):
        self.root = root
        self.root.title("成绩走势图")
        self.root.geometry("800x600")

        # 存储数据
        self.x_data = []
        self.y_data = []

        # 顶部输入区
        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_x = tk.StringVar()
        ttk.Entry(frame_input, textvariable=self.var_x, width=10).grid(row=0, column=1, padx=5)

        ttk.Label(frame_input, text="成绩:").grid(row=0, column=2, padx=5)
        self.var_y = tk.StringVar()
        ttk.Entry(frame_input, textvariable=self.var_y, width=10).grid(row=0, column=3, padx=5)

        ttk.Button(frame_input, text="添加成绩", command=self.add_score).grid(row=0, column=4, padx=10)
        ttk.Button(frame_input, text="清空数据", command=self.clear_data).grid(row=0, column=5, padx=5)

        # Matplotlib画布
        self.fig, self.ax = plt.subplots(figsize=(8, 5), dpi=100)
        self.canvas = FigureCanvasTkAgg(self.fig, master=root)
        self.canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True, padx=10, pady=10)

        self.refresh_chart()

    def add_score(self):
        """添加一条成绩记录"""
        try:
            x = float(self.var_x.get())
            y = float(self.var_y.get())
        except ValueError:
            messagebox.showerror("输入错误", "请输入有效的数字！")
            return

        self.x_data.append(x)
        self.y_data.append(y)
        self.var_x.set("")
        self.var_y.set("")
        self.refresh_chart()

    def clear_data(self):
        """清空所有数据"""
        self.x_data.clear()
        self.y_data.clear()
        self.refresh_chart()

    def refresh_chart(self):
        """刷新走势图"""
        self.ax.clear()
        if len(self.x_data) > 0:
            self.ax.plot(self.x_data, self.y_data, marker='o', color='#2E86AB', linewidth=2, markersize=6)
            # 在每个点上标注分数
            for x, y in zip(self.x_data, self.y_data):
                self.ax.text(x, y + 1, str(y), ha='center', fontsize=9)

        self.ax.set_title("成绩变化走势图", fontsize=14)
        self.ax.set_xlabel("考试序号", fontsize=11)
        self.ax.set_ylabel("分数", fontsize=11)
        self.ax.grid(True, alpha=0.3)
        self.canvas.draw()


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