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.photo_path = ""

        # 表单
        ttk.Label(root, text="姓名：").grid(row=0, column=0, padx=10, pady=8, sticky="w")
        self.var_name = tk.StringVar()
        ttk.Entry(root, textvariable=self.var_name, width=30).grid(row=0, column=1, padx=10, pady=8)

        ttk.Label(root, text="学号：").grid(row=1, column=0, padx=10, pady=8, sticky="w")
        self.var_id = tk.StringVar()
        ttk.Entry(root, textvariable=self.var_id, width=30).grid(row=1, column=1, padx=10, pady=8)

        ttk.Label(root, text="班级：").grid(row=2, column=0, padx=10, pady=8, sticky="w")
        self.var_class = tk.StringVar()
        ttk.Entry(root, textvariable=self.var_class, width=30).grid(row=2, column=1, padx=10, pady=8)

        ttk.Label(root, text="学校：").grid(row=3, column=0, padx=10, pady=8, sticky="w")
        self.var_school = tk.StringVar()
        ttk.Entry(root, textvariable=self.var_school, width=30).grid(row=3, column=1, padx=10, pady=8)

        ttk.Label(root, text="照片：").grid(row=4, column=0, padx=10, pady=8, sticky="w")
        ttk.Button(root, text="选择照片", command=self.select_photo).grid(row=4, column=1, padx=10, pady=8, sticky="w")
        self.label_photo = ttk.Label(root, text="未选择图片")
        self.label_photo.grid(row=5, column=1, padx=10, pady=2, sticky="w")

        ttk.Label(root, text="保存路径：").grid(row=6, column=0, padx=10, pady=8, sticky="w")
        self.var_savepath = tk.StringVar(value="student_card.png")
        ttk.Entry(root, textvariable=self.var_savepath, width=30).grid(row=6, column=1, padx=10, pady=8)

        ttk.Button(root, text="生成证件", command=self.generate_card).grid(row=7, column=1, padx=10, pady=15)

    def select_photo(self):
        path = filedialog.askopenfilename(filetypes=[("图片", "*.jpg *.png *.jpeg")])
        if path:
            self.photo_path = path
            self.label_photo.config(text=os.path.basename(path))

    def generate_card(self):
        name = self.var_name.get().strip()
        sid = self.var_id.get().strip()
        cls = self.var_class.get().strip()
        school = self.var_school.get().strip()
        save_path = self.var_savepath.get().strip()

        if not all([name, sid, cls, school]):
            messagebox.showerror("错误", "姓名、学号、班级、学校不能为空！")
            return

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

        # 字体兼容：优先黑体，失败用默认字体
        try:
            font_title = ImageFont.truetype("simhei.ttf", 32)
            font_text = ImageFont.truetype("simhei.ttf", 22)
        except:
            font_title = ImageFont.load_default(size=32)
            font_text = ImageFont.load_default(size=22)

        # 标题
        draw.text((w//2, 30), "学生证", font=font_title, fill="#003366", anchor="mm")

        # 照片框
        photo_box_x, photo_box_y = 60, 70
        photo_w, photo_h = 160, 200
        draw.rectangle([photo_box_x, photo_box_y, photo_box_x+photo_w, photo_box_y+photo_h], outline="#333", width=2)

        if 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_box_x, photo_box_y))
            except Exception as e:
                messagebox.showwarning("警告", f"照片加载失败：{e}")

        # 文字信息
        text_x = 260
        start_y = 80
        line_gap = 40
        info = [
            f"姓名：{name}",
            f"学号：{sid}",
            f"班级：{cls}",
            f"学校：{school}"
        ]
        for i, line in enumerate(info):
            draw.text((text_x, start_y + i*line_gap), line, font=font_text, fill="#222")

        # 底部备注
        draw.text((w//2, h-40), "有效证件 · 仅供校内使用", font=font_text, fill="#555", anchor="mm")

        try:
            img.save(save_path)
            messagebox.showinfo("成功", f"证件已保存到：{save_path}")
        except Exception as e:
            messagebox.showerror("保存失败", str(e))

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