1. 程式人生 > 程式設計 >Python使用Tkinter實現轉盤抽獎器的步驟詳解

Python使用Tkinter實現轉盤抽獎器的步驟詳解

我使用 Python 中的 Tkinter 模組實現了一個簡單的滾動抽獎器,接下來繼續寫一個簡單的轉盤抽獎器。

Tkinter 實現滾動抽獎器參考:https://www.jb51.net/article/177913.htm

滾動抽獎器與點名的場景相似,是從一群人中抽出中獎的人,獎品是提前確定了的,抽獎只是確定中獎的人是誰。這種場景比較適合年會抽獎,獎品的種類和數量已經確定了,通過抽獎來抽出中獎人員,一個獎品對應一次抽獎,直到獎品抽完為止。

還有一種場景是隻固定了獎品種類,數量不受限制,有參與資格的人都可以抽獎,可能所有人都抽中了“特等獎”,也可能所有人都抽到了“謝謝參與”,最終發出多少獎品在抽獎前沒法確定。這種場景比較適合使用“大轉盤”抽獎器。

一、使用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 ,將點選按鈕和抽獎邏輯處理函式關聯到一起。

二、抽獎器程式碼實現和效果展示

按照上面分析的步驟依次實現,完整程式碼如下。

# 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,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('西毒',110)
 label5 = create_label('東邪',110)
 label6 = create_label('掃地僧',200)
 label7 = create_label('南帝',200)
 label8 = create_label('張三丰',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://www.jb51.net/article/66368.htm

最後的抽獎器效果如下:

總結

以上所述是小編給大家介紹的Python使用Tkinter實現滾動轉盤抽獎器的步驟詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們網站的支援!
如果你覺得本文對你有幫助,歡迎轉載,煩請註明出處,謝謝!