import tkinter as tk
from tkinter import messagebox
import random

class LotteryApp:
    def __init__(self, root):
        self.root = root
        self.root.title("🎲 抽签 / 随机点名器")
        self.root.geometry("500x550")
        self.root.resizable(False, False)

        # 数据存储
        self.names = ["张三", "李四", "王五", "赵六", "孙七", "周八", "吴九"]
        self.is_rolling = False

        # ---------- 界面布局 ----------
        # 标题
        tk.Label(root, text="✨ 随机点名器 ✨", font=("微软雅黑", 18, "bold"), fg="#2c3e50").pack(pady=10)

        # 结果显示区域
        self.result_var = tk.StringVar()
        self.result_var.set("点击下方按钮开始")
        self.result_label = tk.Label(root, textvariable=self.result_var, font=("微软雅黑", 32, "bold"),
                                     fg="#e74c3c", bg="#ecf0f1", width=12, height=2, relief="ridge")
        self.result_label.pack(pady=15)

        # 操作按钮框架
        btn_frame = tk.Frame(root)
        btn_frame.pack(pady=10)

        self.roll_btn = tk.Button(btn_frame, text="🎯 随机抽取", font=("微软雅黑", 14), bg="#3498db", fg="white",
                                  width=10, command=self.start_roll)
        self.roll_btn.grid(row=0, column=0, padx=10)

        self.stop_btn = tk.Button(btn_frame, text="⏹ 停止", font=("微软雅黑", 14), bg="#e67e22", fg="white",
                                  width=10, command=self.stop_roll, state=tk.DISABLED)
        self.stop_btn.grid(row=0, column=1, padx=10)

        # 名单管理区域
        manage_frame = tk.LabelFrame(root, text="📋 名单管理", font=("微软雅黑", 12), padx=10, pady=10)
        manage_frame.pack(pady=10, fill="both", expand=True, padx=20)

        # 添加姓名
        add_frame = tk.Frame(manage_frame)
        add_frame.pack(fill="x", pady=5)
        tk.Label(add_frame, text="姓名：", font=("微软雅黑", 11)).pack(side=tk.LEFT)
        self.name_entry = tk.Entry(add_frame, font=("微软雅黑", 11), width=15)
        self.name_entry.pack(side=tk.LEFT, padx=5)
        self.name_entry.bind("<Return>", lambda e: self.add_name())
        tk.Button(add_frame, text="➕ 添加", font=("微软雅黑", 10), bg="#2ecc71", fg="white",
                  command=self.add_name).pack(side=tk.LEFT, padx=5)

        # 列表框与滚动条
        list_frame = tk.Frame(manage_frame)
        list_frame.pack(fill="both", expand=True, pady=5)

        scrollbar = tk.Scrollbar(list_frame)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

        self.listbox = tk.Listbox(list_frame, font=("微软雅黑", 11), yscrollcommand=scrollbar.set,
                                  selectmode=tk.SINGLE, height=8)
        self.listbox.pack(side=tk.LEFT, fill="both", expand=True)
        scrollbar.config(command=self.listbox.yview)

        # 删除与清空按钮
        btn_frame2 = tk.Frame(manage_frame)
        btn_frame2.pack(pady=5)
        tk.Button(btn_frame2, text="❌ 删除选中", font=("微软雅黑", 10), bg="#e74c3c", fg="white",
                  command=self.delete_selected).pack(side=tk.LEFT, padx=5)
        tk.Button(btn_frame2, text="🗑 清空全部", font=("微软雅黑", 10), bg="#95a5a6", fg="white",
                  command=self.clear_all).pack(side=tk.LEFT, padx=5)
        tk.Button(btn_frame2, text="📥 恢复默认", font=("微软雅黑", 10), bg="#f39c12", fg="white",
                  command=self.restore_default).pack(side=tk.LEFT, padx=5)

        # ---------- 状态栏（提前定义，确保在 refresh_listbox 之前） ----------
        self.status_var = tk.StringVar()
        self.status_var.set(f"当前共 {len(self.names)} 人")
        tk.Label(root, textvariable=self.status_var, font=("微软雅黑", 10), fg="#7f8c8d").pack(pady=5)

        # 刷新列表框（现在 status_var 已存在）
        self.refresh_listbox()

    # ---------- 核心功能 ----------
    def refresh_listbox(self):
        """刷新列表框显示"""
        self.listbox.delete(0, tk.END)
        for name in self.names:
            self.listbox.insert(tk.END, name)
        self.status_var.set(f"当前共 {len(self.names)} 人")

    def add_name(self):
        name = self.name_entry.get().strip()
        if not name:
            messagebox.showwarning("提示", "请输入姓名！")
            return
        if name in self.names:
            messagebox.showwarning("提示", f"姓名 '{name}' 已存在！")
            return
        self.names.append(name)
        self.refresh_listbox()
        self.name_entry.delete(0, tk.END)

    def delete_selected(self):
        selected = self.listbox.curselection()
        if not selected:
            messagebox.showwarning("提示", "请先选中要删除的姓名！")
            return
        index = selected[0]
        del self.names[index]
        self.refresh_listbox()

    def clear_all(self):
        if not self.names:
            return
        if messagebox.askyesno("确认", "确定要清空所有姓名吗？"):
            self.names.clear()
            self.refresh_listbox()
            self.result_var.set("名单为空")

    def restore_default(self):
        self.names = ["张三", "李四", "王五", "赵六", "孙七", "周八", "吴九"]
        self.refresh_listbox()
        self.result_var.set("已恢复默认名单")

    # ---------- 随机抽取（含滚动动画） ----------
    def start_roll(self):
        if len(self.names) == 0:
            messagebox.showwarning("提示", "名单为空，无法抽取！")
            return
        if self.is_rolling:
            return

        self.is_rolling = True
        self.roll_btn.config(state=tk.DISABLED)
        self.stop_btn.config(state=tk.NORMAL)
        self.result_var.set("🎰 抽签中...")

        self.roll_count = 0
        self.max_rolls = 15
        self.do_roll()

    def do_roll(self):
        if not self.is_rolling:
            return

        name = random.choice(self.names)
        self.result_var.set(name)

        self.roll_count += 1
        if self.roll_count < self.max_rolls:
            self.root.after(80, self.do_roll)
        else:
            final_name = random.choice(self.names)
            self.result_var.set(f"🎉 {final_name} 🎉")
            self.is_rolling = False
            self.roll_btn.config(state=tk.NORMAL)
            self.stop_btn.config(state=tk.DISABLED)

    def stop_roll(self):
        if self.is_rolling:
            self.is_rolling = False
            self.roll_btn.config(state=tk.NORMAL)
            self.stop_btn.config(state=tk.DISABLED)
            if self.names:
                final_name = random.choice(self.names)
                self.result_var.set(f"🎉 {final_name} 🎉")
            else:
                self.result_var.set("名单为空")

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