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

# 主窗口
root = tk.Tk()
root.title("成绩走势图")
root.geometry("800x600")

# 科目与成绩列表
subjects = ["语文", "数学", "英语", "物理", "化学", "生物", "历史", "地理"]
scores = []

# 创建绘图图表
fig, ax = plt.subplots(figsize=(7, 4), dpi=100)
canvas = FigureCanvasTkAgg(fig, master=root)
canvas.get_tk_widget().pack(pady=20)

# 绘制成绩走势图函数
def draw_score_chart():
    # 清空旧数据
    ax.clear()
    scores.clear()
    
    # 获取输入框中的成绩
    for entry in entry_list:
        score_text = entry.get().strip()
        if not score_text:
            tk.messagebox.showerror("错误", "请输入所有成绩！")
            return
        try:
            score = float(score_text)
            if not (0 <= score <= 100):
                tk.messagebox.showerror("错误", "成绩必须在 0~100 之间！")
                return
            scores.append(score)
        except:
            tk.messagebox.showerror("错误", "成绩必须是数字！")
            return

    # 绘制折线图
    ax.plot(subjects, scores, marker='o', color='#2E86AB', linewidth=2, markersize=8, label="成绩")
    
    # 美化图表
    ax.set_title("成绩走势图", fontsize=14, fontweight='bold')
    ax.set_xlabel("科目", fontsize=12)
    ax.set_ylabel("分数", fontsize=12)
    ax.set_ylim(0, 105)
    ax.grid(True, linestyle='--', alpha=0.6)
    ax.legend()
    
    # 更新图表
    canvas.draw()

# 清空所有输入
def clear_all():
    for entry in entry_list:
        entry.delete(0, tk.END)
    ax.clear()
    canvas.draw()

# 界面：科目 + 输入框
frame = ttk.Frame(root)
frame.pack(pady=10)

entry_list = []
for i, sub in enumerate(subjects):
    ttk.Label(frame, text=sub).grid(row=i, column=0, padx=5, pady=3)
    entry = ttk.Entry(frame, width=10)
    entry.grid(row=i, column=1, padx=5, pady=3)
    entry_list.append(entry)

# 按钮
btn_frame = ttk.Frame(root)
btn_frame.pack(pady=10)

ttk.Button(btn_frame, text="生成成绩走势图", command=draw_score_chart).grid(row=0, column=0, padx=10)
ttk.Button(btn_frame, text="清空", command=clear_all).grid(row=0, column=1, padx=10)

# 启动主循环
root.mainloop()