我使用 Python 中的 Tkinter 模块实现了一个简单的滚动抽奖器,接下来继续写一个简单的转盘抽奖器。
Tkinter 实现滚动抽奖器参考:http://www.zzvips.com/article/63918.html
滚动抽奖器与点名的场景相似,是从一群人中抽出中奖的人,奖品是提前确定了的,抽奖只是确定中奖的人是谁。这种场景比较适合年会抽奖,奖品的种类和数量已经确定了,通过抽奖来抽出中奖人员,一个奖品对应一次抽奖,直到奖品抽完为止。
还有一种场景是只固定了奖品种类,数量不受限制,有参与资格的人都可以抽奖,可能所有人都抽中了“特等奖”,也可能所有人都抽到了“谢谢参与”,最终发出多少奖品在抽奖前没法确定。这种场景比较适合使用“大转盘”抽奖器。
一、使用Tkinter实现滚动抽奖器的步骤
1. 界面搭建
首先需要搭建一个简单的 GUI 界面,效果如下图(参考)。
首先创建一个大小适合的窗口,使用 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 ,将点击按钮和抽奖逻辑处理函数关联到一起。
二、抽奖器代码实现和效果展示
按照上面分析的步骤依次实现,完整代码如下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
# 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 就可以完成设置。
最后的抽奖器效果如下:
总结
以上所述是小编给大家介绍的Python使用Tkinter实现滚动转盘抽奖器的步骤详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
原文链接:https://blog.csdn.net/weixin_43790276/article/details/103828556