import tkinter as tk
from tkinter import ttk, messagebox
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

# 解决中文显示问题
plt.rcParams["font.family"] = ["SimHei", "Microsoft YaHei"]
plt.rcParams["axes.unicode_minus"] = False

root = tk.Tk()
root.title("成绩走势图")
root.geometry("900x600")

subjects = []
scores = []
canvas_widget = None  # 用于控制图表不重复叠加


def add_score():
    sub = entry_sub.get().strip()
    sc = entry_sco.get().strip()
    if not sub or not sc:
        messagebox.showwarning("提示", "科目和分数不能为空")
        return
    try:
        sc = float(sc)
    except:
        messagebox.showwarning("提示", "分数必须是数字")
        return
    if sc < 0 or sc > 100:
        messagebox.showwarning("提示", "分数在0-100之间")
        return

    subjects.append(sub)
    scores.append(sc)
    entry_sub.delete(0, tk.END)
    entry_sco.delete(0, tk.END)
    messagebox.showinfo("成功", f"已添加：{sub} {sc}分")


def draw_plot():
    global canvas_widget
    if not subjects:
        messagebox.showwarning("提示", "请先添加成绩")
        return

    # 先销毁旧图表
    if canvas_widget:
        canvas_widget.destroy()

    fig, ax = plt.subplots(figsize=(8, 4), dpi=90)
    ax.plot(subjects, scores, marker='o',
            linewidth=2, color='#4285F4', label='分数')
    ax.set_title('成绩走势图')
    ax.set_xlabel('科目/考试')
    ax.set_ylabel('分数')
    ax.set_ylim(0, 105)
    ax.grid(True, alpha=0.3)
    ax.legend()

    canvas = FigureCanvasTkAgg(fig, root)
    canvas.draw()
    canvas_widget = canvas.get_tk_widget()
    canvas_widget.pack(pady=10)


def clear_all():
    global subjects, scores, canvas_widget
    subjects.clear()
    scores.clear()
    if canvas_widget:
        canvas_widget.destroy()
        canvas_widget = None
    messagebox.showinfo("提示", "已清空所有数据")


# 界面
frame_top = ttk.Frame(root)
frame_top.pack(pady=15)

ttk.Label(frame_top, text="科目：").grid(row=0, column=0, padx=5)
entry_sub = ttk.Entry(frame_top, width=12)
entry_sub.grid(row=0, column=1, padx=5)

ttk.Label(frame_top, text="分9数：").grid(row=0, column=2, padx=5)
entry_sco = ttk.Entry(frame_top, width=12)
entry_sco.grid(row=0, column=3, padx=5)

frame_btn = ttk.Frame(root)
frame_btn.pack(pady=5)

ttk.Button(frame_btn, text="添加成绩", command=add_score).grid(
    row=0, column=0, padx=8)
ttk.Button(frame_btn, text="生成走势图", command=draw_plot).grid(
    row=0, column=1, padx=8)
ttk.Button(frame_btn, text="清空数据", command=clear_all).grid(
    row=0, column=2, padx=8)

root.mainloop()
