import tkinter as tk
from tkinter import ttk, messagebox
from PIL import Image, ImageDraw, ImageFont
import random

# 预设数据：用于随机生成
FIRST_NAMES = ["李", "王", "张", "刘", "陈", "杨", "赵", "黄", "周", "吴"]
LAST_NAMES = ["明", "华", "伟", "芳", "强", "静", "敏", "杰", "丽", "军"]
GRADES = ["高一", "高二", "高三", "大一", "大二", "大三", "大四"]
CLASSES = ["(1)班", "(2)班", "(3)班", "(4)班", "(5)班"]
GENDERS = ["男", "女"]


class StudentIDGenerator:
    def __init__(self, root):
        self.root = root
        self.root.title("学生证件生成器")
        self.root.geometry("800x600")

        # 初始化变量
        self.name_var = tk.StringVar()     # 姓名
        self.student_id_var = tk.StringVar()  # 学号
        self.class_var = tk.StringVar()   # 班级
        self.gender_var = tk.StringVar()  # 性别

        # 创建界面
        self.create_widgets()

    def create_widgets(self):
        # 1. 信息输入区域
        input_frame = ttk.LabelFrame(self.root, text="学生信息")
        input_frame.pack(padx=20, pady=10, fill="x")

        # 姓名
        ttk.Label(input_frame, text="姓名：").grid(
            row=0, column=0, padx=5, pady=5, sticky="w")
        ttk.Entry(input_frame, textvariable=self.name_var,
                  width=20).grid(row=0, column=1, padx=5, pady=5)

        # 学号
        ttk.Label(input_frame, text="学号：").grid(
            row=0, column=2, padx=5, pady=5, sticky="w")
        ttk.Entry(input_frame, textvariable=self.student_id_var,
                  width=20).grid(row=0, column=3, padx=5, pady=5)

        # 班级
        ttk.Label(input_frame, text="班级：").grid(
            row=1, column=0, padx=5, pady=5, sticky="w")
        ttk.Entry(input_frame, textvariable=self.class_var,
                  width=20).grid(row=1, column=1, padx=5, pady=5)

        # 性别
        ttk.Label(input_frame, text="性别：").grid(
            row=1, column=2, padx=5, pady=5, sticky="w")
        ttk.Entry(input_frame, textvariable=self.gender_var,
                  width=20).grid(row=1, column=3, padx=5, pady=5)

        # 随机生成按钮
        ttk.Button(input_frame, text="随机生成信息", command=self.generate_random_info).grid(
            row=0, column=4, rowspan=2, padx=10, pady=5)

        # 2. 功能按钮区域
        btn_frame = ttk.Frame(self.root)
        btn_frame.pack(padx=20, pady=10)

        ttk.Button(btn_frame, text="生成学生证", command=self.generate_id_card).grid(
            row=0, column=0, padx=10, pady=5)

        # 3. 预览区域
        preview_frame = ttk.LabelFrame(self.root, text="证件预览")
        preview_frame.pack(padx=20, pady=10, fill="both", expand=True)

        self.preview_label = ttk.Label(preview_frame)
        self.preview_label.pack(padx=10, pady=10, fill="both", expand=True)

        # 初始化生成的证件图片对象
        self.generated_id_card = None

    def generate_random_info(self):
        """随机生成学生信息并填充到输入框"""
        # 随机姓名：姓氏+名字
        first_name = random.choice(FIRST_NAMES)
        last_name = random.choice(LAST_NAMES)
        full_name = first_name + last_name

        # 随机学号：2024开头 + 6位随机数字
        student_id = "2024" + str(random.randint(100000, 999999))

        # 随机班级：年级+班级
        grade = random.choice(GRADES)
        cls = random.choice(CLASSES)
        full_class = grade + cls

        # 随机性别
        gender = random.choice(GENDERS)

        # 填充到输入框
        self.name_var.set(full_name)
        self.student_id_var.set(student_id)
        self.class_var.set(full_class)
        self.gender_var.set(gender)

    def generate_id_card(self):
        """生成学生证图片并预览"""
        # 验证必填信息
        if not self.name_var.get() or not self.student_id_var.get():
            messagebox.showwarning("警告", "姓名和学号不能为空！")
            return

        # 1. 创建学生证背景（尺寸：600x400像素）
        id_card = Image.new("RGB", (600, 400), (255, 255, 255))
        draw = ImageDraw.Draw(id_card)

        # 2. 添加边框
        draw.rectangle([10, 10, 589, 389], outline=(0, 0, 0), width=2)

        # 3. 添加标题
        try:
            # 尝试加载系统字体（Windows），如果失败则使用默认字体
            title_font = ImageFont.truetype("simhei.ttf", 36)
            info_font = ImageFont.truetype("simhei.ttf", 24)
            small_font = ImageFont.truetype("simhei.ttf", 18)
        except:
            title_font = ImageFont.load_default(size=36)
            info_font = ImageFont.load_default(size=24)
            small_font = ImageFont.load_default(size=18)

        draw.text((200, 30), "学生证件", font=title_font, fill=(0, 0, 0))

        # 4. 添加学生信息
        info_y = 100
        draw.text((80, info_y),
                  f"姓名：{self.name_var.get()}", font=info_font, fill=(0, 0, 0))
        draw.text((80, info_y + 50),
                  f"学号：{self.student_id_var.get()}", font=info_font, fill=(0, 0, 0))
        draw.text((80, info_y + 100),
                  f"班级：{self.class_var.get()}", font=info_font, fill=(0, 0, 0))
        draw.text((80, info_y + 150),
                  f"性别：{self.gender_var.get()}", font=info_font, fill=(0, 0, 0))

        # 5. 添加底部文字
        draw.text((150, 350), "有效期：2024-2028",
                  font=small_font, fill=(100, 100, 100))

        # 保存生成的图片对象，并在预览区显示
        self.generated_id_card = id_card

        # 调整预览尺寸（兼容新旧版本Pillow）
        preview_size = (400, 267)  # 按比例缩小
        # 关键修复：使用旧版本兼容的 Image.LANCZOS
        preview_img = id_card.resize(preview_size, Image.LANCZOS)

        # 转换为tkinter可用的格式
        from PIL import ImageTk
        self.preview_img_tk = ImageTk.PhotoImage(preview_img)
        self.preview_label.config(image=self.preview_img_tk)


if __name__ == "__main__":
    root = tk.Tk()
    app = StudentIDGenerator(root)
    root.mainloop()
