import tkinter as tk
from tkinter import font, messagebox
# 导入绘图组件
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt

# ---------------------- 全局数据存储 ----------------------
score_names = []  # 科目/考试名称
score_values = [] # 对应分数

# ---------------------- 绘图更新函数 ----------------------
def draw_chart():
    # 清空原有画布
    fig.clf()
    ax = fig.add_subplot(111)
    
    if len(score_names) == 0:
        ax.text(0.5, 0.5, "暂无成绩数据\n请录入成绩", ha="center", va="center", fontsize=14)
    else:
        # 绘制古风红色折线
        ax.plot(score_names, score_values, color="#8C2318", marker="o", linewidth=3, markersize=8)
        # 每个点标注分数
        for x, y in zip(score_names, score_values):
            ax.text(x, y+1, str(y), fontsize=10, ha="center", color="#593822")
        # 坐标轴设置
        ax.set_title("成绩走势", fontsize=16, color="#8C2318", fontfamily="SimHei")
        ax.set_ylabel("分数", fontfamily="SimHei")
        ax.set_xlabel("考试/科目", fontfamily="SimHei")
        ax.set_ylim(0, 105) # 分数0-100
        ax.grid(color="#D8C8B0", alpha=0.4)
    
    canvas.draw()

# ---------------------- 添加成绩 ----------------------
def add_score():
    name = entry_name.get().strip()
    score_str = entry_score.get().strip()
    if not name:
        messagebox.showwarning("提示", "请输入科目/考试名称！")
        return
    if not score_str.isdigit():
        messagebox.showwarning("提示", "分数必须输入数字！")
        return
    score = int(score_str)
    if score < 0 or score > 100:
        messagebox.showwarning("提示", "分数范围0~100！")
        return
    
    # 存入列表
    score_names.append(name)
    score_values.append(score)
    # 清空输入框
    entry_name.delete(0, tk.END)
    entry_score.delete(0, tk.END)
    # 刷新图表
    draw_chart()

# ---------------------- 清空所有数据 ----------------------
def clear_all():
    global score_names, score_values
    score_names = []
    score_values = []
    draw_chart()

# ---------------------- 主窗口古风界面搭建 ----------------------
root = tk.Tk()
root.title("古风成绩走势图")
root.geometry("780x680")
root.resizable(False, False)
root.config(bg="#F5EEDC") # 宣纸底色

# 字体兼容
try:
    title_font = font.Font(family="楷体", size=24, weight="bold")
    text_font = font.Font(family="宋体", size=14)
    btn_font = font.Font(family="宋体", size=13)
except:
    title_font = font.Font(size=24, weight="bold")
    text_font = font.Font(size=14)
    btn_font = font.Font(size=13)

# 顶部标题
tk.Label(
    root, text="成绩走势分析图",
    font=title_font, bg="#F5EEDC", fg="#8C2318"
).pack(pady=12)

# 输入区域框架
input_frame = tk.Frame(root, bg="#F5EEDC")
input_frame.pack(pady=8)

# 科目输入
tk.Label(input_frame, text="科目/考试：", font=text_font, bg="#F5EEDC", fg="#442E1F").grid(row=0, column=0, padx=6)
entry_name = tk.Entry(input_frame, font=text_font, width=12, bg="#FFF9E8")
entry_name.grid(row=0, column=1, padx=6)

# 分数输入
tk.Label(input_frame, text="分数：", font=text_font, bg="#F5EEDC", fg="#442E1F").grid(row=0, column=2, padx=6)
entry_score = tk.Entry(input_frame, font=text_font, width=8, bg="#FFF9E8")
entry_score.grid(row=0, column=3, padx=6)

# 按钮区域
btn_frame = tk.Frame(root, bg="#F5EEDC")
btn_frame.pack(pady=10)
style_red = {"bg":"#A6341B", "fg":"white", "activebackground":"#7A2514"}
style_brown = {"bg":"#C4936B", "fg":"white", "activebackground":"#9E704E"}

tk.Button(btn_frame, text="添加成绩", font=btn_font, command=add_score, width=10,**style_red).grid(row=0, column=0, padx=10)
tk.Button(btn_frame, text="清空全部", font=btn_font, command=clear_all, width=10,**style_brown).grid(row=0, column=1, padx=10)

# 绘图容器（红木边框）
chart_frame = tk.Frame(root, bg="#8C2318", bd=7, relief=tk.RIDGE)
chart_frame.pack(padx=20, pady=10, fill=tk.BOTH, expand=True)

# 创建画布
plt.rcParams["font.sans-serif"] = ["SimHei"]  # 解决中文乱码
plt.rcParams["axes.unicode_minus"] = False
fig = plt.Figure(figsize=(7, 4.8), facecolor="#FFF9E8")
canvas = FigureCanvasTkAgg(fig, master=chart_frame)
canvas_widget = canvas.get_tk_widget()
canvas_widget.pack(padx=6, pady=6, fill=tk.BOTH, expand=True)

# 底部落款
tk.Label(
    root, text="学业成绩 · 趋势记录",
    font=font.Font(size=12), bg="#F5EEDC", fg="#664433"
).pack(pady=15)

# 初始化空白图表
draw_chart()

root.mainloop()