Python使用Tkinter实现转盘抽奖器的步骤详解


Posted in Python onJanuary 06, 2020

我使用 Python 中的 Tkinter 模块实现了一个简单的滚动抽奖器,接下来继续写一个简单的转盘抽奖器。

Tkinter 实现滚动抽奖器参考:https://3water.com/article/177913.htm

滚动抽奖器与点名的场景相似,是从一群人中抽出中奖的人,奖品是提前确定了的,抽奖只是确定中奖的人是谁。这种场景比较适合年会抽奖,奖品的种类和数量已经确定了,通过抽奖来抽出中奖人员,一个奖品对应一次抽奖,直到奖品抽完为止。

还有一种场景是只固定了奖品种类,数量不受限制,有参与资格的人都可以抽奖,可能所有人都抽中了“特等奖”,也可能所有人都抽到了“谢谢参与”,最终发出多少奖品在抽奖前没法确定。这种场景比较适合使用“大转盘”抽奖器。

一、使用Tkinter实现滚动抽奖器的步骤

1. 界面搭建

首先需要搭建一个简单的 GUI 界面,效果如下图(参考)。

Python使用Tkinter实现转盘抽奖器的步骤详解

首先创建一个大小适合的窗口,使用 Tkinter.Tk() 方法创建并返回一个窗口对象 window 。

使用 window 对象的 geometry(widthxheight+x+y) 方法设置窗口的大小,geometry() 方法中的参数格式为 widthxheight+x+y,如 '500x290+250+150',width 是窗口的宽度,height 是窗口的高度,中间使用乘号连接,如果敲不出这个符号,可以去源码中复制,x 和 y 用于设置窗口离电脑屏幕左上角的距离。

2. 设置转盘的内容

使用转盘抽奖时,点击开始后,转到不同方向对应不同的奖品种类,所以要设置每个方向显示不同的内容。

使用 Tkinter 中的 Label 类,实例化 Label 的对象来显示文字。

实例化 Label 时,第一个参数必须是 Tkinter 窗口对象 window,然后通过 text 设置显示的内容。每个 Label 显示的内容都是固定不变的,所以可以一开始就写死。然后使用关键字参数的方式,根据需要设置显示框大小,背景颜色,显示字体等,再通过 Label 对象的 place() 方法设置它相对于窗口左上角的位置。

在这个转盘抽奖器中,我分了8个不同的方向,8个区域,所以需要8个 Label 。在这8个标签中,除了显示的内容和位置不一样,其他的设置都是一样的,所以将添加标签的步骤封装成一个函数,创建标签时更方便。

3. 设置开始按钮

在界面中,需要一个“开始”按钮,用来开始抽奖。转盘抽奖是点击开始后,抽奖界面开始转动,速度由快到慢,直到自动停止,最后停止的区域就是中奖的区域,所以不用“停止”按钮。

使用 Tkinter 中的 Button 类,实例化 Button 的对象来创建“开始”按钮。

实例化 Button 时,第一个参数也必须是 Tkinter 窗口对象 window,然后根据需要设置按钮大小,背景颜色,显示字体等,最后还是使用 place() 方法设置它相对于的窗口左上角的位置。

当点击按钮时,开始抽奖,定义好处理抽奖逻辑的函数,用匿名函数的方式传给 Button 中的 command ,将点击按钮和抽奖逻辑处理函数关联到一起。

二、抽奖器代码实现和效果展示

按照上面分析的步骤依次实现,完整代码如下。

# coding=utf-8
import sys
if sys.version_info[0] == 2:
 import Tkinter
 from Tkinter import *
else:
 import tkinter as Tkinter
 from tkinter import *
import random
 
is_run = False
 
 
def lottery_whirl(data, i, number):
 global is_run
 if i == 0:
 j = 0
 else:
 j = i % 8
 data[j-1]['bg'] = '#CCCCCC'
 data[j]['bg'] = '#00CD00'
 wait = [a for a in range(100, 300, 10)] + [b for b in range(300, 600, 300 // (number-28))] + \
 [c for c in range(600, 1200, 120)] + [d for d in range(1200, 1800, 200)]
 if i < number:
 window.after(wait[i], lottery_whirl, data, i + 1, number)
 else:
 is_run = False
 
 
def lottery_start(data):
 global is_run
 if is_run:
 return
 is_run = True
 for x in range(len(data) - 1):
 data[x]['bg'] = '#CCCCCC'
 number = random.randint(30, 53)
 lottery_whirl(data, 0, number)
 
 
def create_label(name, x, y):
 label = Label(window, text=name, width=13, height=3, bg='#CCCCCC', font='宋体 -18 bold')
 label.place(anchor=NW, x=x, y=y)
 return label
 
 
if __name__ == '__main__':
 window = Tkinter.Tk()
 window.geometry('500x290+250+150')
 window.title(' 转 盘 抽 奖 器')
 
 bg_label = Label(window, width=80, height=24, bg='#ECf5FF')
 bg_label.place(anchor=NW, x=0, y=0)
 
 label1 = create_label('风清扬', 20, 20)
 label2 = create_label('北丐', 180, 20)
 label3 = create_label('无崖子', 340, 20)
 label4 = create_label('西毒', 20, 110)
 label5 = create_label('东邪', 340, 110)
 label6 = create_label('扫地僧', 20, 200)
 label7 = create_label('南帝', 180, 200)
 label8 = create_label('张三丰', 340, 200)
 data = [label1, label2, label3, label5, label8, label7, label6, label4]
 button_core = Button(window, text='开 始', command=lambda: lottery_start(data), width=130, height=53, bg='#00CD00',
  font='宋体 -18 bold', bitmap='gray50', compound=Tkinter.CENTER)
 button_core.place(anchor=NW, x=180, y=110)
 window.mainloop()

当点击开始抽奖后,抽奖界面开始转动,直到自动停止才算一次抽奖结束。如果第一次抽奖还没有结束,点了第二次(或很多次)抽奖,会有多次抽奖并行运行,那样会有很多次转动重叠到一起,相互干扰,抽奖器就失效了。所以在代码中设置了一个全局变量 is_run,表示抽奖器是否还在运行中,如果还在运行中,就不会进行下一次抽奖。

在抽奖器转动时,速度是由快变慢的,所以设置了一个列表来控制转动的延迟时间,这个时间列表可以分多段,每一段可以是等差数列,不过差值设置越来越大。

点击开始按钮,开始转动时,代码中已经确定了转到哪个位置(中奖类型),转到哪个位置是由转动的次数决定的,转动次数也是从一个列表中取。转盘抽奖不会设置停在每个区域的概率都一样(那样意味着每种奖的中奖概率相同),所以,从列表中取转动次数时,先根据需要设置好概率的大小,使用 random 模块中的 choices 就可以完成设置。

random 模块使用参考: https://3water.com/article/66368.htm

最后的抽奖器效果如下:

Python使用Tkinter实现转盘抽奖器的步骤详解

总结

以上所述是小编给大家介绍的Python使用Tkinter实现滚动转盘抽奖器的步骤详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python查看zip包中文件及大小的方法
Jul 09 Python
Python编程实现控制cmd命令行显示颜色的方法示例
Aug 14 Python
Django管理员账号和密码忘记的完美解决方法
Dec 06 Python
django mysql数据库及图片上传接口详解
Jul 18 Python
Python Web框架之Django框架Form组件用法详解
Aug 16 Python
Python字符串和正则表达式中的反斜杠('\')问题详解
Sep 03 Python
TensorFlow tf.nn.conv2d实现卷积的方式
Jan 03 Python
Python3操作读写CSV文件使用包过程解析
Apr 10 Python
用python实现名片管理系统
Jun 18 Python
13个Pandas实用技巧,助你提高开发效率
Aug 19 Python
python 5个顶级异步框架推荐
Sep 09 Python
python中使用.py配置文件的方法详解
Nov 23 Python
pytorch 实现在预训练模型的 input上增减通道
Jan 06 #Python
Python 将json序列化后的字符串转换成字典(推荐)
Jan 06 #Python
Python tkinter三种布局实例详解
Jan 06 #Python
Python有参函数使用代码实例
Jan 06 #Python
python通过移动端访问查看电脑界面
Jan 06 #Python
基于pytorch 预训练的词向量用法详解
Jan 06 #Python
导入tensorflow:ImportError: libcublas.so.9.0 报错
Jan 06 #Python
You might like
用php实现的下载css文件中的图片的代码
2010/02/08 PHP
PHP多文件上传实例
2015/07/09 PHP
ThinkPHP+EasyUI之ComboTree中的会计科目树形菜单实现方法
2017/06/09 PHP
js各种验证文本框输入格式(正则表达式)
2010/10/22 Javascript
jQuery中json对象的复制方式介绍(数组及对象)
2013/06/08 Javascript
js控制表单不能输入空格的小例子
2013/11/20 Javascript
js给页面加style无效果的解决方法
2014/01/20 Javascript
让checkbox不选中即将选中的checkbox不选中
2014/07/11 Javascript
JavaScript 学习笔记之变量及其作用域
2015/01/14 Javascript
JQuery实现DIV其他动画效果的简单实例
2016/09/18 Javascript
JS中使用mailto实现将用户在网页中输入的内容传递到本地邮件客户端
2016/10/08 Javascript
jQuery快速高效制作网页交互特效
2017/02/24 Javascript
vue-cli项目中怎么使用mock数据
2017/09/27 Javascript
浅谈在vue中用webpack打包之后运行文件的问题以及相关配置方法
2018/02/21 Javascript
Servlet3.0与纯javascript通过Ajax交互的实例详解
2018/03/18 Javascript
详解jQuery-each()方法
2019/03/13 jQuery
详解vue项目中调用百度地图API使用方法
2019/04/25 Javascript
vue项目里面引用svg文件并给svg里面的元素赋值
2020/08/17 Javascript
Handtrack.js库实现实时监测手部运动(推荐)
2021/02/08 Javascript
[02:43]中国五虎出征TI3视频
2013/08/02 DOTA
python单链表实现代码实例
2013/11/21 Python
Python中Django发送带图片和附件的邮件
2017/03/31 Python
Python实现一个转存纯真IP数据库的脚本分享
2017/05/21 Python
Python读取和处理文件后缀为.sqlite的数据文件(实例讲解)
2017/06/27 Python
TensorFlow实现随机训练和批量训练的方法
2018/04/28 Python
python+opencv+caffe+摄像头做目标检测的实例代码
2018/08/03 Python
Python 实现键盘鼠标按键模拟
2020/11/18 Python
ebookers英国:隶属全球最大的在线旅游公司Expedia
2017/12/28 全球购物
书香校园活动方案
2014/02/28 职场文书
大学社团招新的通讯稿
2014/09/10 职场文书
公司离职证明范本(5篇)
2014/09/17 职场文书
教师拔河比赛广播稿
2014/10/14 职场文书
先进教育工作者事迹材料
2014/12/23 职场文书
企业催款函范本
2015/06/24 职场文书
民警忠诚教育心得体会
2016/01/23 职场文书
PostgreSQL并行计算算法及参数强制并行度设置方法
2022/04/07 PostgreSQL