import tkinter as tk
from tkinter import ttk, messagebox
import random
import matplotlib.pyplot as plt

# 设置中文字体，解决中文乱码
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
plt.rcParams["axes.unicode_minus"] = False

def generate_score_trend():
    """生成随机成绩并绘制走势图"""
    try:
        # 1. 获取用户输入的参数
        exam_count = int(entry_exam.get())  # 考试次数
        min_score = int(entry_min.get())    # 最低分
        max_score = int(entry_max.get())    # 最高分

        # 2. 校验输入合法性
        if not (1 <= exam_count <= 50):
            messagebox.showerror("错误", "考试次数请输入1-50之间的整数")
            return
        if not (0 <= min_score <= max_score <= 150):
            messagebox.showerror("错误", "分数范围必须在 0~150 之间，且最低分≤最高分")
            return

        # 3. 生成随机成绩数据
        exam_names = [f"第{i+1}次考试" for i in range(exam_count)]
        scores = [random.randint(min_score, max_score) for _ in range(exam_count)]

        # 4. 绘制成绩走势图
        plt.figure(figsize=(10, 6), dpi=100)
        plt.plot(exam_names, scores, marker="o", linewidth=2, markersize=8, 
                 color="#2E86AB", label="考试成绩")
        plt.fill_between(exam_names, scores, alpha=0.2, color="#2E86AB")
        
        # 添加数值标签
        for x, y in zip(exam_names, scores):
            plt.text(x, y + 2, str(y), ha="center", fontsize=10)

        # 图表样式
        plt.title("学生成绩随机走势图", fontsize=16, pad=20)
        plt.xlabel("考试", fontsize=12)
        plt.ylabel("分数", fontsize=12)
        plt.ylim(0, 160)
        plt.grid(True, alpha=0.3)
        plt.legend()
        plt.xticks(rotation=30)
        plt.tight_layout()
        
        # 显示图表
        plt.show()

    except ValueError:
        messagebox.showerror("输入错误", "请输入有效的数字！")

# ====================== 界面主程序 ======================
root = tk.Tk()
root.title("随机成绩走势图生成器")
root.geometry("420x280")
root.resizable(False, False)

# 标题标签
tk.Label(root, text="随机成绩走势图生成器", font=("微软雅黑", 16, "bold")).pack(pady=15)

# 输入框框架
frame = ttk.Frame(root)
frame.pack(pady=10, padx=20, fill="x")

# 考试次数
ttk.Label(frame, text="考试次数：").grid(row=0, column=0, sticky="w", padx=5, pady=8)
entry_exam = ttk.Entry(frame)
entry_exam.grid(row=0, column=1, padx=5, pady=8)
entry_exam.insert(0, "10")  # 默认10次

# 最低分
ttk.Label(frame, text="最低分数：").grid(row=1, column=0, sticky="w", padx=5, pady=8)
entry_min = ttk.Entry(frame)
entry_min.grid(row=1, column=1, padx=5, pady=8)
entry_min.insert(0, "60")

# 最高分
ttk.Label(frame, text="最高分数：").grid(row=2, column=0, sticky="w", padx=5, pady=8)
entry_max = ttk.Entry(frame)
entry_max.grid(row=2, column=1, padx=5, pady=8)
entry_max.insert(0, "100")

# 生成按钮
btn_generate = ttk.Button(root, text="生成成绩走势图", command=generate_score_trend)
btn_generate.pack(pady=15, ipadx=10, ipady=5)

# 运行界面
root.mainloop()