手把手教你创建一个有趣的Python抽奖程序

科技   2024-08-03 22:27   浙江  

手把手教你创建一个有趣的Python抽奖程序

哈喽,大家好,我是老表,学 Python 编程,找老表就对了。

老表写教程,就是要写的小白也能懂!

在这篇文章中,我们要来做一件超级酷的事情——创建一个超有趣的Python抽奖程序!想象一下,在聚会上公众号推文留言抽奖中,大家兴奋地等着看看谁会幸运地赢得大奖,我甩出这个程序,必将成为全场焦点。那么,快准备好你的键盘,我们开始吧!

先看效果~

豆瓣8.4,《Python极客项目编程》第二版!留言区开奖啦~恭喜JF

迟到的开奖~

第一步:安装必要的工具

在我们开始之前,我们需要安装一些必要的Python库。不用担心,这超级简单!打开你的终端,然后输入以下命令:

pip install tkinter pillow 

这样我们就有了创建图形界面、处理图像和文字识别的工具。我们准备就绪了!

如果你第一次知道Python,也可以看看我的往期入门文章

第二步:创建我们的主程序文件

接下来,打开你最喜欢的代码编辑器(VSCode、PyCharm、Notepad++,随便你!),然后创建一个新的Python文件,命名为lottery.py

第三步:导入我们需要的库

我们需要导入一些库来帮我们实现这个程序。把以下代码放在你的文件顶部:

import tkinter as tk
from tkinter import filedialog, messagebox, simpledialog
from PIL import Image, ImageTk
import random

这些库将用创建用户界面,处理文件对话框,显示消息框,进行简单对话框输入,以及实现图像处理和随机抽奖功能。

第四步:创建主界面类

好了,现在我们来创建主界面类。这个类将管理整个程序的界面和功能。放松,这比听起来简单多了:

class LotteryApp:
def__init__(self, root):
        self.root = root
        self.root.title("GeekDraw")
        self.root.configure(bg="lightgreen")

        self.participants =[]
        self.winner_count =1
        self.probabilities ={}

        self.scroll_job =None
        self.stop_job =None

        self.setup_ui()

到目前为止,我们只是设置了一些基本的属性。让我们继续构建用户界面!

第五步:设置用户界面

在这个步骤中,我们将创建并布局各个界面元素。这个部分有点长,但它是我们美妙的抽奖程序的灵魂所在。主要功能是:支持用户上传txt文件(上传文件按钮),或者用户自己输入(输入框),设置中奖人数等框。

def setup_ui(self):
    self.frame = tk.Frame(self.root, bg="lightgreen")
    self.frame.pack(pady=20)

    self.upload_button = tk.Button(self.frame, text="上传名单", command=self.upload_file, bg="white")
    self.upload_button.grid(row=0, column=0, padx=10)

    self.participants_label = tk.Label(self.frame, text="参与者名单", bg="lightgreen")
    self.participants_label.grid(row=1, column=0)

    self.participants_text = tk.Text(self.frame, width=50, height=15)
    self.participants_text.grid(row=2, column=0, padx=10, pady=10)

    self.count_label = tk.Label(self.frame, text="总参与人数: 0", bg="lightgreen")
    self.count_label.grid(row=3, column=0)

    self.winner_label = tk.Label(self.frame, text="设置中奖人数", bg="lightgreen")
    self.winner_label.grid(row=4, column=0)

    self.winner_entry = tk.Entry(self.frame)
    self.winner_entry.grid(row=5, column=0, pady=5)

    self.set_prob_button = tk.Button(self.frame, text="设置中奖概率", command=self.set_probability, bg="white")
    self.set_prob_button.grid(row=6, column=0, pady=5)

    self.draw_button = tk.Button(self.frame, text="开始抽奖", command=self.draw_lottery, bg="white")
    self.draw_button.grid(row=7, column=0, pady=5)

    self.result_label = tk.Label(self.frame, text="", bg="lightgreen", font=("Helvetica",16))
    self.result_label.grid(row=8, column=0, pady=10)

    self.scroll_canvas = tk.Canvas(self.frame, width=300, height=30, bg="white")
    self.scroll_canvas.grid(row=9, column=0, pady=10)
    self.scroll_text = self.scroll_canvas.create_text(150,15, text="", font=("Helvetica",16))

我们已经完成了界面的大部分工作。接下来,我们需要实现一些功能方法,让界面真正动起来。

第六步:实现功能方法

上传文件方法

def upload_file(self):
    file_path = filedialog.askopenfilename(filetypes=[("Text files","*.txt")])
ifnot file_path:
return

withopen(file_path,'r', encoding='utf-8')as file:
        text = file.read()

    self.participants = text.splitlines()
    self.update_participants_text()

更新参与者名单方法

def update_participants_text(self):
    self.participants_text.delete("1.0", tk.END)
    self.participants_text.insert(tk.END, "\n".join(self.participants))
    self.count_label.config(text=f"总参与人数: {len(self.participants)}")

设置中奖概率方法

def set_probability(self):
    name = simpledialog.askstring("设置中奖概率","输入参与者姓名:")
if name and name in self.participants:
        prob = simpledialog.askfloat("设置中奖概率",f"设置 {name} 的中奖概率(0-1):")
if prob isnotNone:
            self.probabilities[name]= prob
            messagebox.showinfo("设置成功",f"{name} 的中奖概率已设置为 {prob}")
else:
        messagebox.showwarning("错误","参与者不存在")

开始抽奖方法

def draw_lottery(self):
try:
        self.winner_count =int(self.winner_entry.get())
exceptValueError:
        messagebox.showwarning("错误","请输入有效的中奖人数")
return

if self.winner_count <=0or self.winner_count >len(self.participants):
        messagebox.showwarning("错误","中奖人数必须在1和参与人数之间")
return

    self.scroll_participants()

滚动显示参与者方法

def scroll_participants(self):
    self.scroll_names = self.participants[:]
    random.shuffle(self.scroll_names)
    self.scroll_index =0
    self.update_scroll()
    self.stop_job = self.root.after(5000, self.stop_scroll)

defupdate_scroll(self):
if self.scroll_index >=len(self.scroll_names):
        self.scroll_index =0

    self.scroll_canvas.itemconfig(self.scroll_text, text=self.scroll_names[self.scroll_index])
    self.scroll_index +=1

    self.scroll_job = self.root.after(100, self.update_scroll)

defstop_scroll(self):
if self.scroll_job:
        self.root.after_cancel(self.scroll_job)
    winners = self.pick_winners()
    self.result_label.config(text="中奖者: "+", ".join(winners))
    self.show_confetti()

选择中奖者方法

def pick_winners(self):
    weighted_list =[]
for p in self.participants:
        weight = self.probabilities.get(p,1.0)
        weighted_list.extend([p]*int(weight *100))

    winners = random.sample(weighted_list, self.winner_count)
return winners

defshow_confetti(self):
    messagebox.showinfo("恭喜","🎉 中奖者已揭晓 🎉")
    self.result_label.after(200, self.clear_confetti)

defclear_confetti(self):
    self.result_label.config(text="")

第七步:运行程序

终于到了见证奇迹的时刻!将以下代码放在你的Python文件的末尾,然后运行程序:

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

运行这段代码,你将看到一个漂亮的抽奖程序界面。上传名单,设置中奖人数,开始抽奖,然后见证幸运儿的诞生!

总结与拓展

通过这篇教程,你已经学会了如何创建一个功能齐全的Python抽奖程序。我们利用了Tkinter库来创建用户界面,用PIL库实现图像处理,最后使用random库进行随机抽奖。整个过程既有趣又充满了成就感!

为了让这个程序更加酷炫,你还可以进行一些拓展:

  1. 1. 增加文件类型支持:除了文本文件和图片,可以考虑支持Excel文件,这样可以更方便地导入参与者名单。

  2. 2. 增加动画和音效:在抽奖过程中添加一些动画效果和音效,让整个过程更加激动人心。

  3. 3. 结合数据库:使用SQLite或其他数据库来存储和管理参与者数据,这样即使程序关闭也不会丢失数据。

  4. 4. 增强安全性:确保用户输入的数据是有效的,比如限制中奖概率的范围在0到1之间。

希望这篇文章对你有所帮助,祝你编码愉快!让我们一起继续编写更多有趣的Python程序吧!

欢迎大家评论交流~

和老表一起学:

加入我们

扫码加我微信,回复:AI阅读
一起迎接AI时代

简说Python
号主老表,自学,分享Python,SQL零基础入门、数据分析、数据挖掘、机器学习优质文章以及学习经验。
 最新文章