import tkinter as tk
from tkinter import ttk, messagebox
import random

class RandomRollCall:
    def __init__(self, root):
        self.root = root
        self.root.title("随机点名抽签器")
        self.root.geometry("620x520")
        self.root.resizable(False, False)
        self.root.configure(bg="#f0f4f8")

        # 全体名单
        self.name_list = [
            "张三", "李四", "王五", "赵六",
            "钱七", "孙八", "周九", "吴十",
            "郑十一", "冯十二", "陈十三", "褚十四"
        ]
        self.already_pick = []  # 已经抽到过的人
        self.is_running = False # 是否正在滚动抽取

        # ========== 顶部标题 ==========
        title_label = tk.Label(
            root, text="课堂随机点名器",
            font=("微软雅黑", 20, "bold"), bg="#f0f4f8", fg="#2c3e50"
        )
        title_label.pack(pady=12)

        # ========== 中间大号名字显示区域 ==========
        show_frame = tk.Frame(root, bg="white", bd=3, relief=tk.GROOVE)
        show_frame.pack(pady=8, padx=20, fill=tk.X)

        self.show_name_var = tk.StringVar(value="准备开始点名")
        display_label = tk.Label(
            show_frame, textvariable=self.show_name_var,
            font=("微软雅黑", 36, "bold"), fg="#d63031", bg="white",
            width=18, height=2
        )
        display_label.pack(pady=15)

        # ========== 按钮区域 ==========
        btn_frame = tk.Frame(root, bg="#f0f4f8")
        btn_frame.pack(pady=10)

        self.btn_start = tk.Button(
            btn_frame, text="开始抽取", width=10, height=2,
            font=("微软雅黑", 12), bg="#00b894", fg="white",
            command=self.start_roll
        )
        self.btn_start.grid(row=0, column=0, padx=8)

        self.btn_stop = tk.Button(
            btn_frame, text="停止抽取", width=10, height=2,
            font=("微软雅黑", 12), bg="#e17055", fg="white",
            command=self.stop_roll, state=tk.DISABLED
        )
        self.btn_stop.grid(row=0, column=1, padx=8)

        self.btn_reset = tk.Button(
            btn_frame, text="重置全部", width=10, height=2,
            font=("微软雅黑", 12), bg="#0984e3", fg="white",
            command=self.reset_all
        )
        self.btn_reset.grid(row=0, column=2, padx=8)

        # ========== 下方：名单管理 + 抽取记录 ==========
        bottom_frame = tk.Frame(root, bg="#f0f4f8")
        bottom_frame.pack(pady=10, fill=tk.BOTH, expand=True, padx=15)

        # 左侧：所有人员列表
        left_frame = tk.Frame(bottom_frame)
        left_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
        tk.Label(left_frame, text="全体名单", font=("微软雅黑", 11, "bold"), bg="#f0f4f8").pack()
        self.list_all = tk.Listbox(left_frame, height=8, font=("微软雅黑", 10))
        self.list_all.pack(fill=tk.BOTH, expand=True)
        self.refresh_all_list()

        # 右侧：已抽取记录
        right_frame = tk.Frame(bottom_frame)
        right_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True, padx=(10, 0))
        tk.Label(right_frame, text="已抽取名单", font=("微软雅黑", 11, "bold"), bg="#f0f4f8").pack()
        self.list_picked = tk.Listbox(right_frame, height=8, font=("微软雅黑", 10))
        self.list_picked.pack(fill=tk.BOTH, expand=True)

        # ========== 添加新名字输入框 ==========
        add_frame = tk.Frame(root, bg="#f0f4f8")
        add_frame.pack(pady=6)
        self.entry_new = tk.Entry(add_frame, font=("微软雅黑", 11), width=20)
        self.entry_new.grid(row=0, column=0, padx=5)
        tk.Button(
            add_frame, text="添加人员", font=("微软雅黑", 10),
            bg="#6c5ce7", fg="white", command=self.add_person
        ).grid(row=0, column=1)

    # 刷新全体名单列表
    def refresh_all_list(self):
        self.list_all.delete(0, tk.END)
        for name in self.name_list:
            self.list_all.insert(tk.END, name)

    # 滚动动画：不停切换名字
    def rolling_animation(self):
        if not self.is_running:
            return
        random_name = random.choice(self.name_list)
        self.show_name_var.set(random_name)
        self.root.after(60, self.rolling_animation)

    # 开始抽取
    def start_roll(self):
        if self.is_running:
            return
        if len(self.name_list) == 0:
            messagebox.showwarning("提示", "名单为空，请先添加人员！")
            return
        self.is_running = True
        self.btn_start.config(state=tk.DISABLED)
        self.btn_stop.config(state=tk.NORMAL)
        self.rolling_animation()

    # 停止抽取，确定选中人员
    def stop_roll(self):
        if not self.is_running:
            return
        self.is_running = False
        self.btn_start.config(state=tk.NORMAL)
        self.btn_stop.config(state=tk.DISABLED)

        picked_name = self.show_name_var.get()
        self.already_pick.append(picked_name)
        self.list_picked.insert(tk.END, picked_name)

    # 重置：清空抽取记录，恢复初始状态
    def reset_all(self):
        self.is_running = False
        self.show_name_var.set("准备开始点名")
        self.already_pick.clear()
        self.list_picked.delete(0, tk.END)
        self.btn_start.config(state=tk.NORMAL)
        self.btn_stop.config(state=tk.DISABLED)

    # 添加新人员到名单
    def add_person(self):
        new_name = self.entry_new.get().strip()
        if new_name == "":
            messagebox.showinfo("提示", "请输入姓名")
            return
        if new_name in self.name_list:
            messagebox.showinfo("提示", "该人员已存在")
            return
        self.name_list.append(new_name)
        self.refresh_all_list()
        self.entry_new.delete(0, tk.END)

if __name__ == "__main__":
    window = tk.Tk()
    app = RandomRollCall(window)
    window.mainloop()