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

# 创建主窗口
root = tk.Tk()
root.title("学生证件生成器")
root.geometry("480x420")
root.resizable(False, False)

# 定义变量
stu_id = tk.StringVar()
stu_name = tk.StringVar()
stu_class = tk.StringVar()
stu_gender = tk.StringVar()
stu_birth = tk.StringVar()
img_path = tk.StringVar()

# 选择照片文件
def select_photo():
    path = filedialog.askopenfilename(
        title="选择证件照片",
        filetypes=[("图片文件", "*.jpg;*.png;*.jpeg")]
    )
    if path:
        img_path.set(path)

# 生成学生证图片
def generate_card():
    # 获取所有输入内容
    sid = stu_id.get().strip()
    name = stu_name.get().strip()
    cls = stu_class.get().strip()
    gender = stu_gender.get().strip()
    birth = stu_birth.get().strip()
    pic = img_path.get().strip()

    # 校验必填项
    if not all([sid, name, cls, gender, birth, pic]):
        messagebox.showwarning("提示", "所有信息与照片都必须填写选择！")
        return
    if not os.path.exists(pic):
        messagebox.showerror("错误", "选中的图片文件不存在！")
        return

    # 证件画布尺寸 宽600 高400
    width, height = 600, 400
    card = Image.new("RGB", (width, height), color="#f5f7fa")
    draw = ImageDraw.Draw(card)

    # 尝试加载字体，兼容无黑体环境
    try:
        font_title = ImageFont.truetype("simhei.ttf", 32)
        font_text = ImageFont.truetype("simhei.ttf", 20)
    except:
        font_title = ImageFont.load_default(size=32)
        font_text = ImageFont.load_default(size=20)

    # 绘制标题
    draw.text((width//2, 30), "学 生 证", font=font_title, fill="#222222", anchor="mt")

    # 粘贴照片（缩放裁剪）
    try:
        photo = Image.open(pic).convert("RGB")
        photo = photo.resize((150, 180), Image.Resampling.LANCZOS)
        card.paste(photo, (40, 80))
    except Exception as e:
        messagebox.showerror("图片错误", f"图片读取失败：{str(e)}")
        return

    # 文字信息排版
    info_list = [
        f"学  号：{sid}",
        f"姓  名：{name}",
        f"班  级：{cls}",
        f"性  别：{gender}",
        f"出生日期：{birth}"
    ]
    start_y = 90
    for line in info_list:
        draw.text((220, start_y), line, font=font_text, fill="#111111")
        start_y += 45

    # 底部落款
    draw.text((width//2, 340), "★ 学校教务处 ★", font=font_text, fill="#444444", anchor="mt")

    # 保存文件
    save_name = f"学生证_{name}_{sid}.jpg"
    card.save(save_name)
    messagebox.showinfo("完成", f"证件已生成，保存为：{save_name}\n文件在程序同文件夹内")
    card.show()

# ========== 界面布局 ==========
pad_x, pad_y = 8, 6

# 学号
tk.Label(root, text="学    号：").grid(row=0, column=0, padx=pad_x, pady=pad_y, sticky="e")
tk.Entry(root, textvariable=stu_id, width=30).grid(row=0, column=1)

# 姓名
tk.Label(root, text="姓    名：").grid(row=1, column=0, padx=pad_x, pady=pad_y, sticky="e")
tk.Entry(root, textvariable=stu_name, width=30).grid(row=1, column=1)

# 班级
tk.Label(root, text="班    级：").grid(row=2, column=0, padx=pad_x, pady=pad_y, sticky="e")
tk.Entry(root, textvariable=stu_class, width=30).grid(row=2, column=1)

# 性别
tk.Label(root, text="性    别：").grid(row=3, column=0, padx=pad_x, pady=pad_y, sticky="e")
tk.Entry(root, textvariable=stu_gender, width=30).grid(row=3, column=1)

# 生日
tk.Label(root, text="出生日期：").grid(row=4, column=0, padx=pad_x, pady=pad_y, sticky="e")
tk.Entry(root, textvariable=stu_birth, width=30).grid(row=4, column=1)

# 照片选择行
tk.Label(root, text="证件照片：").grid(row=5, column=0, padx=pad_x, pady=pad_y, sticky="e")
tk.Entry(root, textvariable=img_path, width=22).grid(row=5, column=1, sticky="w")
tk.Button(root, text="浏览", command=select_photo, width=5).grid(row=5, column=1, sticky="e")

# 生成按钮
tk.Button(
    root,
    text="一键生成学生证",
    command=generate_card,
    bg="#2185d0",
    fg="white",
    font=("微软雅黑",12),
    height=2
).grid(row=6, column=0, columnspan=2, pady=20)

root.mainloop()