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

        # 界面布局
        main_frame = ttk.Frame(root, padding=20)
        main_frame.pack(fill=tk.BOTH, expand=True)

        # 姓名
        ttk.Label(main_frame, text="姓名：").grid(row=0, column=0, sticky="w", pady=6)
        self.name_var = tk.StringVar()
        ttk.Entry(main_frame, textvariable=self.name_var, width=30).grid(row=0, column=1, padx=10)

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

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

        # 专业
        ttk.Label(main_frame, text="专业：").grid(row=3, column=0, sticky="w", pady=6)
        self.major_var = tk.StringVar()
        ttk.Entry(main_frame, textvariable=self.major_var, width=30).grid(row=3, column=1, padx=10)

        # 照片选择
        ttk.Label(main_frame, text="证件照片：").grid(row=4, column=0, sticky="w", pady=8)
        self.photo_text = tk.StringVar(value="未选择图片")
        ttk.Label(main_frame, textvariable=self.photo_text).grid(row=4, column=1, sticky="w")
        ttk.Button(main_frame, text="选择照片", command=self.select_photo).grid(row=5, column=1, sticky="w", padx=10)

        # 生成按钮
        ttk.Button(main_frame, text="生成学生证件", command=self.generate_card).grid(row=6, column=0, columnspan=2, pady=20)

    def select_photo(self):
        path = filedialog.askopenfilename(
            title="选择证件照",
            filetypes=[("图片文件", "*.jpg;*.png;*.jpeg")]
        )
        if path:
            self.photo_path = path
            self.photo_text.set(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()
        major = self.major_var.get().strip()

        if not all([name, sid, cls, major]):
            messagebox.showwarning("提示", "请填写完整学生信息！")
            return
        if not self.photo_path:
            messagebox.showwarning("提示", "请选择证件照片！")
            return

        # 创建证件画布 宽600 高380
        width, height = 600, 380
        card = Image.new("RGB", (width, height), color="#f0f6fc")
        draw = ImageDraw.Draw(card)

        # 尝试加载字体，兼容中文
        try:
            font_title = ImageFont.truetype("simhei.ttf", 32)
            font_text = ImageFont.truetype("simhei.ttf", 20)
        except:
            try:
                font_title = ImageFont.truetype("msyh.ttc", 32)
                font_text = ImageFont.truetype("msyh.ttc", 20)
            except:
                font_title = ImageFont.load_default(size=32)
                font_text = ImageFont.load_default(size=20)

        # 标题
        draw.text((width//2, 25), "学 生 证", font=font_title, fill="#194080", anchor="mt")

        # 粘贴照片
        try:
            img = Image.open(self.photo_path).convert("RGB")
            img = img.resize((140, 170))
            card.paste(img, (40, 70))
        except Exception as e:
            messagebox.showerror("图片错误", f"图片加载失败：{e}")
            return

        # 文字信息
        y_start = 80
        line_gap = 42
        info_list = [
            f"姓    名：{name}",
            f"学    号：{sid}",
            f"班    级：{cls}",
            f"专    业：{major}"
        ]
        for text in info_list:
            draw.text((210, y_start), text, font=font_text, fill="#222222")
            y_start += line_gap

        # 底部文字
        draw.text((width//2, height-35), "有效证件 · 仅供校内使用", font=font_text, fill="#555555", anchor="mt")

        # 保存文件
        save_path = filedialog.asksaveasfilename(
            defaultextension=".jpg",
            filetypes=[("JPG图片", "*.jpg"), ("PNG图片", "*.png")],
            initialfile=f"{name}_学生证.jpg"
        )
        if save_path:
            card.save(save_path)
            messagebox.showinfo("成功", f"证件已保存至：{save_path}")
            # 可选自动打开
            # card.show()

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