from tkinter import *
from tkinter import ttk, messagebox
from PIL import Image, ImageDraw, ImageFont
import os

# 证件尺寸设置 宽×高
CARD_W = 600
CARD_H = 380
SAVE_PATH = "student_card"

# 创建保存文件夹
if not os.path.exists(SAVE_PATH):
    os.mkdir(SAVE_PATH)

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

        # 存储输入变量
        self.data = {
            "name": StringVar(),
            "sex": StringVar(),
            "grade": StringVar(),
            "class_": StringVar(),
            "id": StringVar(),
            "school": StringVar()
        }
        self.build_ui()

    def build_ui(self):
        """搭建输入界面"""
        info_list = [
            ("姓名：", self.data["name"]),
            ("性别：", self.data["sex"]),
            ("年级：", self.data["grade"]),
            ("班级：", self.data["class_"]),
            ("学号：", self.data["id"]),
            ("学校：", self.data["school"])
        ]
        # 循环生成输入框
        for index, (text, var) in enumerate(info_list):
            Label(self.root, text=text, font=("微软雅黑",11)).grid(row=index, column=0, padx=15, pady=8, sticky=W)
            Entry(self.root, textvariable=var, width=32, font=("微软雅黑",11)).grid(row=index, column=1, padx=5)

        # 按钮区域
        frame_btn = Frame(self.root)
        frame_btn.grid(row=7, column=0, columnspan=2, pady=20)
        Button(frame_btn, text="生成预览证件", command=self.make_card, bg="#2E86AB", fg="white", width=12, font=("微软雅黑",10)).pack(side=LEFT,padx=10)
        Button(frame_btn, text="清空输入", command=self.clear_all, bg="#E63946", fg="white", width=12, font=("微软雅黑",10)).pack(side=LEFT,padx=10)

    def make_card(self):
        """绘制证件图片"""
        # 获取表单数据
        name = self.data["name"].get().strip()
        sex = self.data["sex"].get().strip()
        grade = self.data["grade"].get().strip()
        cls = self.data["class_"].get().strip()
        sid = self.data["id"].get().strip()
        school = self.data["school"].get().strip()

        # 非空校验
        if not all([name,sex,grade,cls,sid,school]):
            messagebox.showwarning("提示","所有信息不能为空！")
            return

        # 创建画布 浅蓝底色证件
        img = Image.new("RGB", (CARD_W, CARD_H), color="#F0F8FF")
        draw = ImageDraw.Draw(img)

        # 字体兼容处理
        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.rectangle([20,20,CARD_W-20,CARD_H-20], outline="#195B9C", width=3)
        # 标题
        draw.text((CARD_W//2,40),"学生证",font=font_title,fill="#003366",anchor="mm")

        # 内容排版
        content = [
            f"姓    名：{name}",
            f"性    别：{sex}",
            f"年    级：{grade}",
            f"班    级：{cls}",
            f"学    号：{sid}",
            f"就读院校：{school}"
        ]
        y_start = 110
        for txt in content:
            draw.text((60,y_start), txt, font=font_text, fill="#222222")
            y_start +=42

        # 底部备注
        draw.text((CARD_W//2, CARD_H-50), "有效期：在校就读期间有效", font=font_text, fill="#555555", anchor="mm")

        # 保存文件
        save_file = os.path.join(SAVE_PATH, f"{sid}_{name}_学生证.png")
        img.save(save_file)
        # 弹窗+打开图片
        messagebox.showinfo("生成成功",f"证件已保存至：\n{save_file}")
        img.show()

    def clear_all(self):
        """清空所有输入框"""
        for v in self.data.values():
            v.set("")

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