找回密码
 中文实名注册
搜索
查看: 303|回复: 0

抽奖游戏 李承键

[复制链接]

8

主题

1

回帖

15

积分

新手上路

积分
15
发表于 2025-6-15 17:22:55 | 显示全部楼层 |阅读模式
本帖最后由 李承键 于 2025-6-15 17:24 编辑

[Python] 纯文本查看 复制代码
import tkinter as tk
from tkinter import ttk, messagebox
import random
import time

class LotteryGame:
    def __init__(self, root):
        """初始化抽奖游戏界面"""
        self.root = root
        self.root.title("抽奖小游戏")
        self.root.geometry("500x400")
        self.root.resizable(False, False)
        
        # 配置中文字体
        self.font_style = ("SimHei", 12)
        self.title_font = ("SimHei", 16, "bold")
        
        # 候选人列表
        self.candidates = ["张三", "李四", "王五", "赵六", "钱七", "孙八",
                          "周九", "吴十", "郑十一", "王十二", "冯十三", "陈十四"]
        
        # 创建界面元素
        self.create_widgets()
    
    def create_widgets(self):
        """创建界面上的各种组件"""
        # 标题
        title_label = tk.Label(self.root, text="幸运抽奖", font=self.title_font, fg="red")
        title_label.pack(pady=20)
        
        # 显示抽奖结果的区域
        result_frame = tk.Frame(self.root, width=400, height=100, bd=2, relief="sunken")
        result_frame.pack(pady=10, padx=20, fill="x")
        
        self.result_label = tk.Label(result_frame, text="点击下方按钮开始抽奖", 
                                    font=self.font_style, width=30, height=4)
        self.result_label.pack(expand=True)
        
        # 候选人列表显示区域
        list_frame = tk.Frame(self.root, width=400, height=100, bd=2, relief="sunken")
        list_frame.pack(pady=10, padx=20, fill="both", expand=True)
        
        list_label = tk.Label(list_frame, text="候选人名单:", font=self.font_style)
        list_label.pack(anchor="w", padx=10, pady=5)
        
        self.candidate_text = tk.Text(list_frame, height=3, width=45, font=self.font_style)
        self.candidate_text.pack(padx=10, pady=5, fill="both", expand=True)
        self.update_candidate_list()
        
        # 控制按钮区域
        button_frame = tk.Frame(self.root)
        button_frame.pack(pady=20)
        
        self.start_button = tk.Button(button_frame, text="开始抽奖", 
                                     font=self.font_style, width=12, height=2,
                                     command=self.start_lottery)
        self.start_button.pack(side="left", padx=40)
        
        self.add_button = tk.Button(button_frame, text="添加候选人", 
                                   font=self.font_style, width=12, height=2,
                                   command=self.add_candidate)
        self.add_button.pack(side="left", padx=20)
        
        self.reset_button = tk.Button(button_frame, text="重置", 
                                     font=self.font_style, width=12, height=2,
                                     command=self.reset_game)
        self.reset_button.pack(side="left", padx=40)
        
        # 状态栏
        status_bar = tk.Label(self.root, text="状态: 准备就绪", bd=1, relief="sunken", anchor="w")
        status_bar.pack(side="bottom", fill="x")
    
    def update_candidate_list(self):
        """更新候选人名单显示"""
        self.candidate_text.delete(1.0, tk.END)
        for candidate in self.candidates:
            self.candidate_text.insert(tk.END, candidate + "  ")
    
    def start_lottery(self):
        """开始抽奖过程"""
        if not self.candidates:
            messagebox.showerror("错误", "候选人名单为空,请先添加候选人!")
            return
        
        self.start_button.config(state="disabled")
        self.result_label.config(text="抽奖中...")
        self.root.update()
        
        # 模拟抽奖过程,快速显示候选人名字
        for _ in range(30):
            random_candidate = random.choice(self.candidates)
            self.result_label.config(text=random_candidate)
            self.root.update()
            time.sleep(0.1)
        
        # 显示最终抽奖结果
        winner = random.choice(self.candidates)
        self.result_label.config(text=f"恭喜 {winner} 中奖!", fg="red")
        messagebox.showinfo("抽奖结果", f"恭喜 {winner} 获得奖品!")
        
        self.start_button.config(state="normal")
    
    def add_candidate(self):
        """添加新的候选人"""
        add_window = tk.Toplevel(self.root)
        add_window.title("添加候选人")
        add_window.geometry("300x150")
        add_window.resizable(False, False)
        
        label = tk.Label(add_window, text="请输入候选人姓名:", font=self.font_style)
        label.pack(pady=10)
        
        entry = tk.Entry(add_window, font=self.font_style, width=20)
        entry.pack(pady=5)
        
        def confirm_add():
            name = entry.get().strip()
            if name:
                self.candidates.append(name)
                self.update_candidate_list()
                add_window.destroy()
            else:
                messagebox.showwarning("警告", "请输入有效的姓名!")
        
        button_frame = tk.Frame(add_window)
        button_frame.pack(pady=10)
        
        confirm_button = tk.Button(button_frame, text="确认添加", 
                                 font=self.font_style, command=confirm_add)
        confirm_button.pack(side="left", padx=20)
        
        cancel_button = tk.Button(button_frame, text="取消", 
                                font=self.font_style, command=add_window.destroy)
        cancel_button.pack(side="left", padx=20)
    
    def reset_game(self):
        """重置游戏"""
        confirm = messagebox.askyesno("确认", "确定要重置游戏吗?所有数据将被恢复默认。")
        if confirm:
            self.candidates = ["张三", "李四", "王五", "赵六", "钱七", "孙八",
                             "周九", "吴十", "郑十一", "王十二", "冯十三", "陈十四"]
            self.update_candidate_list()
            self.result_label.config(text="点击下方按钮开始抽奖", fg="black")
            messagebox.showinfo("重置成功", "游戏已重置为默认状态。")

if __name__ == "__main__":
    root = tk.Tk()
    game = LotteryGame(root)
    root.mainloop()

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 中文实名注册

本版积分规则

快速回复 返回顶部 返回列表