我使用 Python 中的 Tkinter 模塊實現了一個簡單的滾動抽獎器,接下來繼續寫一個簡單的轉盤抽獎器。
Tkinter 實現滾動抽獎器參考:http://www.zmynmublwnt.cn/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