[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()