import tkinter as tk
from tkinter import ttk, filedialog, messagebox
from PIL import Image, ImageDraw, ImageFont
import os


class StudentIDGenerator:
    def __init__(self, root):
        self.root = root
        self.root.title("学生证件生成器")
        self.root.geometry("900x600")
        self.root.resizable(False, False)

        # 存储用户输入
        self.fields = {
            "姓名": tk.StringVar(),
            "学号": tk.StringVar(),
            "学院": tk.StringVar(),
            "专业": tk.StringVar(),
            "入学年份": tk.StringVar(),
            "照片路径": tk.StringVar()
        }

        self.create_widgets()

    def create_widgets(self):
        # 左侧表单区域
        form_frame = tk.Frame(self.root, width=300, padx=20, pady=20)
        form_frame.pack(side=tk.LEFT, fill=tk.Y)

        labels = ["姓名", "学号", "学院", "专业", "入学年份", "照片路径"]
        for i, label in enumerate(labels):
            tk.Label(form_frame, text=label + ":",
                     anchor="w").grid(row=i, column=0, sticky="w", pady=5)
            if label == "照片路径":
                entry = tk.Entry(
                    form_frame, textvariable=self.fields[label], width=25)
                entry.grid(row=i, column=1, pady=5)
                btn = tk.Button(form_frame, text="选择图片",
                                command=self.select_photo)
                btn.grid(row=i, column=2, padx=5, pady=5)
            else:
                entry = tk.Entry(
                    form_frame, textvariable=self.fields[label], width=28)
                entry.grid(row=i, column=1, columnspan=2, pady=5)

        # 生成按钮
        gen_btn = tk.Button(form_frame, text="生成证件", command=self.generate_id,
                            bg="#4CAF50", fg="white", font=("微软雅黑", 12))
        gen_btn.grid(row=len(labels), column=0, columnspan=3, pady=20)

        # 右侧预览区域
        self.preview_label = tk.Label(
            self.root, text="证件预览区", bg="gray", width=60, height=30)
        self.preview_label.pack(side=tk.RIGHT, padx=20,
                                pady=20, fill=tk.BOTH, expand=True)

    def select_photo(self):
        file_path = filedialog.askopenfilename(
            title="选择学生照片",
            filetypes=[("Image files", "*.jpg *.jpeg *.png")]
        )
        if file_path:
            self.fields["照片路径"].set(file_path)
            self.update_preview_photo(file_path)

    def update_preview_photo(self, path):
        try:
            img = Image.open(path)
            img.thumbnail((100, 120))  # 缩略图
            photo_img = ImageTk.PhotoImage(img)
            self.preview_label.config(image=photo_img, text="")
            self.preview_label.image = photo_img
        except Exception as e:
            messagebox.showerror("错误", f"无法加载图片: {e}")

    def generate_id(self):
        data = {k: v.get() for k, v in self.fields.items()}
        if not all([data["姓名"], data["学号"], data["学院"], data["专业"], data["入学年份"]]):
            messagebox.showwarning("提示", "请填写完整的学生信息！")
            return
        if not os.path.exists(data["照片路径"]):
            messagebox.showwarning("提示", "请选择有效的学生照片！")
            return

        # 创建证件图片
        card_width, card_height = 400, 250
        card = Image.new("RGB", (card_width, card_height), "white")
        draw = ImageDraw.Draw(card)

        # 画边框
        draw.rectangle([(0, 0), (card_width-1, card_height-1)],
                       outline="blue", width=3)

        # 尝试加载中文字体
        try:
            font_title = ImageFont.truetype("simhei.ttf", 24)
            font_text = ImageFont.truetype("simhei.ttf", 18)
        except:
            font_title = ImageFont.load_default()
            font_text = ImageFont.load_default()

        # 标题
        draw.text((120, 10), "学生证", font=font_title, fill="blue")

        # 插入照片
        try:
            photo = Image.open(data["照片路径"]).convert("RGB")
            photo = photo.resize((80, 100))
            card.paste(photo, (20, 50))
        except:
            draw.rectangle([(20, 50), (100, 150)], outline="black")  # 无图时画框

        # 文字信息
        x_text = 120
        y_start = 50
        line_h = 30
        info_list = [
            f"姓名: {data['姓名']}",
            f"学号: {data['学号']}",
            f"学院: {data['学院']}",
            f"专业: {data['专业']}",
            f"入学年份: {data['入学年份']}"
        ]
        for i, txt in enumerate(info_list):
            draw.text((x_text, y_start + i*line_h),
                      txt, font=font_text, fill="black")

        # 保存
        save_path = filedialog.asksaveasfilename(defaultextension=".png", filetypes=[
                                                 ("PNG files", "*.png"), ("JPEG files", "*.jpg")])
        if save_path:
            card.save(save_path)
            messagebox.showinfo("成功", f"证件已保存到:\n{save_path}")
            # 预览生成的证件
            card.show()


# 运行程序
if __name__ == "__main__":
    from PIL import ImageTk
    root = tk.Tk()
    app = StudentIDGenerator(root)
    root.mainloop()
