import tkinter as tk
from tkinter import ttk, messagebox
from PIL import Image, ImageDraw, ImageFont
import os

class StudentCardGenerator:
    def __init__(self, root):
        self.root = root
        self.root.title("学生证件生成器")
        self.root.geometry("520x420")

        # 表单变量
        self.var_name = tk.StringVar()
        self.var_id = tk.StringVar()
        self.var_class = tk.StringVar()
        self.var_major = tk.StringVar()
        self.var_school = tk.StringVar(value="某某中学")

        # 构建UI
        self.build_ui()

    def build_ui(self):
        frame_main = ttk.Frame(self.root, padding=20)
        frame_main.pack(fill=tk.BOTH, expand=True)

        ttk.Label(frame_main, text="学生证件生成", font=("微软雅黑",16)).grid(row=0, column=0, columnspan=2, pady=10)

        # 输入项
        items = [
            ("姓名：", self.var_name),
            ("学号：", self.var_id),
            ("班级：", self.var_class),
            ("专业：", self.var_major),
            ("学校：", self.var_school),
        ]

        for i,(text, var) in enumerate(items):
            ttk.Label(frame_main, text=text).grid(row=i+1, column=0, sticky="w", pady=6)
            ttk.Entry(frame_main, textvariable=var, width=35).grid(row=i+1, column=1, padx=10)

        # 按钮
        btn_frame = ttk.Frame(frame_main)
        btn_frame.grid(row=7, column=0, columnspan=2, pady=20)

        ttk.Button(btn_frame, text="生成证件图片", command=self.generate_card).pack(side=tk.LEFT, padx=8)
        ttk.Button(btn_frame, text="清空", command=self.clear_all).pack(side=tk.LEFT, padx=8)

        # 状态提示
        self.status_label = ttk.Label(frame_main, text="", foreground="green")
        self.status_label.grid(row=8, column=0, columnspan=2)

    def generate_card(self):
        name = self.var_name.get().strip()
        sid = self.var_id.get().strip()
        clazz = self.var_class.get().strip()
        major = self.var_major.get().strip()
        school = self.var_school.get().strip()

        if not all([name, sid, clazz, school]):
            messagebox.showwarning("提示", "姓名、学号、班级、学校不能为空！")
            return

        # 创建证件画布 宽400 高260
        width, height = 400, 260
        img = Image.new("RGB", (width, height), color="#f0f7ff")
        draw = ImageDraw.Draw(img)

        # 尝试加载字体，失败使用默认
        try:
            font_big = ImageFont.truetype("simhei.ttf", 24)
            font_normal = ImageFont.truetype("simhei.ttf", 16)
        except:
            font_big = ImageFont.load_default(size=24)
            font_normal = ImageFont.load_default(size=16)

        # 绘制边框
        draw.rectangle([8,8,width-8,height-8], outline="#2b5797", width=3)

        # 内容文本
        draw.text((20,20), school, font=font_big, fill="#1a3b70")
        draw.text((20,65), f"姓    名：{name}", font=font_normal, fill="#000000")
        draw.text((20,95), f"学    号：{sid}", font=font_normal, fill="#000000")
        draw.text((20,125), f"班    级：{clazz}", font=font_normal, fill="#000000")
        draw.text((20,155), f"专    业：{major}", font=font_normal, fill="#000000")
        draw.text((20,195), "————学生证件————", font=font_normal, fill="#2b5797")

        save_path = "student_card.png"
        img.save(save_path)
        self.status_label.config(text=f"✅已保存：{os.path.abspath(save_path)}")
        messagebox.showinfo("完成", f"学生证件已生成！\n保存位置：{save_path}")

    def clear_all(self):
        self.var_name.set("")
        self.var_id.set("")
        self.var_class.set("")
        self.var_major.set("")
        self.var_school.set("某某中学")
        self.status_label.config(text="")

if __name__ == "__main__":
    root = tk.Tk()
    app = StudentCardGenerator(root)
    root.mainloop()
