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

# 全局存储数据：考试次数、分数
exam_list = []
score_list = []

# 创建主窗口
root = tk.Tk()
root.title("学生成绩走势图")
root.geometry("750x550")

# 配置matplotlib画布
plt.rcParams["font.sans-serif"] = ["SimHei"]  # 中文显示
plt.rcParams["axes.unicode_minus"] = False
fig = plt.Figure(figsize=(7, 4), dpi=100)
ax = fig.add_subplot(111)

# 画布嵌入tk窗口
canvas = FigureCanvasTkAgg(fig, master=root)
canvas_widget = canvas.get_tk_widget()

# 左侧输入区域框架
frame_input = ttk.Frame(root, padding=10)
frame_input.pack(side=tk.LEFT, fill=tk.Y)

# 考试场次输入
ttk.Label(frame_input, text="考试序号：").grid(row=0, column=0, sticky="w", pady=5)
var_exam = tk.StringVar()
entry_exam = ttk.Entry(frame_input, textvariable=var_exam, width=12)
entry_exam.grid(row=0, column=1, padx=5)

# 成绩输入
ttk.Label(frame_input, text="考试分数：").grid(row=1, column=0, sticky="w", pady=5)
var_score = tk.StringVar()
entry_score = ttk.Entry(frame_input, textvariable=var_score, width=12)
entry_score.grid(row=1, column=1, padx=5)

# 添加成绩按钮
def add_score():
    """添加数据并刷新图表"""
    try:
        exam = int(var_exam.get())
        score = float(var_score.get())
        if not (0 <= score <= 100):
            messagebox.showwarning("警告", "分数必须在0~100之间！")
            return
        exam_list.append(exam)
        score_list.append(score)
        # 清空输入框
        var_exam.set("")
        var_score.set("")
        draw_chart()
    except ValueError:
        messagebox.showerror("输入错误", "请输入合法数字！")

# 清空所有数据
def clear_data():
    exam_list.clear()
    score_list.clear()
    draw_chart()

btn_add = ttk.Button(frame_input, text="添加成绩", command=add_score)
btn_add.grid(row=2, column=0, columnspan=2, pady=8, sticky="ew")

btn_clear = ttk.Button(frame_input, text="清空数据", command=clear_data)
btn_clear.grid(row=3, column=0, columnspan=2, pady=4, sticky="ew")

# 绘图函数
def draw_chart():
    ax.clear()
    if exam_list and score_list:
        ax.plot(exam_list, score_list, marker='o', color='#E63946', linewidth=2, label="成绩")
        ax.set_ylim(0, 105)
        ax.legend()
    ax.set_title("历次考试成绩变化走势图")
    ax.set_xlabel("考试次数")
    ax.set_ylabel("考试分数")
    ax.grid(True, alpha=0.3)
    canvas.draw()

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

# 初始化空白图表
draw_chart()

# 启动窗口
root.mainloop()