import tkinter as tk
from tkinter import ttk, filedialog, 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.name_var = tk.StringVar()
        self.id_var = tk.StringVar()
        self.class_var = tk.StringVar()
        self.school_var = tk.StringVar()
        self.photo_path = ""

        # 主框架
        frame = ttk.Frame(root, padding=20)
        frame.pack(fill=tk.BOTH, expand=True)

        # 输入项
        ttk.Label(frame, text="姓名：").grid(row=0, column=0, sticky="w", pady=5)
        ttk.Entry(frame, textvariable=self.name_var, width=30).grid(row=0, column=1, pady=5)

        ttk.Label(frame, text="学号：").grid(row=1, column=0, sticky="w", pady=5)
        ttk.Entry(frame, textvariable=self.id_var, width=30).grid(row=1, column=1, pady=5)

        ttk.Label(frame, text="班级：").grid(row=2, column=0, sticky="w", pady=5)
        ttk.Entry(frame, textvariable=self.class_var, width=30).grid(row=2, column=1, pady=5)

        ttk.Label(frame, text="学校：").grid(row=3, column=0, sticky="w", pady=5)
        ttk.Entry(frame, textvariable=self.school_var, width=30).grid(row=3, column=1, pady=5)

        ttk.Button(frame, text="选择照片", command=self.select_photo).grid(row=4, column=0, columnspan=2, pady=8)
        self.photo_label = ttk.Label(frame, text="未选择照片")
        self.photo_label.grid(row=5, column=0, columnspan=2, pady=2)

        ttk.Button(frame, text="生成证件", command=self.generate_card).grid(row=6, column=0, columnspan=2, pady=15)

    def select_photo(self):
        path = filedialog.askopenfilename(
            title="选择证件照",
            filetypes=[("图片文件", "*.jpg;*.png;*.jpeg")]
        )
        if path:
            self.photo_path = path
            self.photo_label.config(text=os.path.basename(path))

    def generate_card(self):
        name = self.name_var.get().strip()
        sid = self.id_var.get().strip()
        cls = self.class_var.get().strip()
        school = self.school_var.get().strip()
        if not all([name, sid, cls, school]):
            messagebox.showwarning("提示", "请填写完整信息！")
            return

        # 证件画布大小
        w, h = 400, 260
        img = Image.new("RGB", (w, h), color="#f0f7ff")
        draw = ImageDraw.Draw(img)

        # 字体兼容（Windows黑体，没有就用默认字体）
        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.text((w//2, 20), "学生证件", font=font_big, fill="#224488", anchor="mm")

        # 照片区域
        photo_x, photo_y = 40, 60
        photo_w, photo_h = 100, 130
        if self.photo_path and os.path.exists(self.photo_path):
            try:
                p = Image.open(self.photo_path).convert("RGB")
                p = p.resize((photo_w, photo_h), Image.Resampling.LANCZOS)
                img.paste(p, (photo_x, photo_y))
            except Exception as e:
                messagebox.showerror("错误", f"照片加载失败：{e}")
                return
        else:
            draw.rectangle([photo_x, photo_y, photo_x+photo_w, photo_y+photo_h], outline="#333", width=2)
            draw.text((photo_x+photo_w//2, photo_y+photo_h//2), "照片", font=font_normal, fill="#666", anchor="mm")

        # 文字信息
        text_x = 170
        draw.text((text_x, 70), f"姓名：{name}", font=font_normal, fill="#222")
        draw.text((text_x, 100), f"学号：{sid}", font=font_normal, fill="#222")
        draw.text((text_x, 130), f"班级：{cls}", font=font_normal, fill="#222")
        draw.text((text_x, 160), f"学校：{school}", font=font_normal, fill="#222")

        # 底部分割线
        draw.line((30, 210, w-30, 210), fill="#224488", width=2)
        draw.text((w//2, 230), "有效期：在校期间", font=font_normal, fill="#555", anchor="mm")

        # 保存图片
        save_path = filedialog.asksaveasfilename(
            defaultextension=".png",
            filetypes=[("PNG图片", "*.png"), ("JPG图片", "*.jpg")],
            title="保存学生证件"
        )
        if save_path:
            img.save(save_path)
            messagebox.showinfo("成功", f"证件已保存！")

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