Python使用Tkinter實(shí)現(xiàn)轉(zhuǎn)盤抽獎器的步驟詳解
我使用 Python 中的 Tkinter 模塊實(shí)現(xiàn)了一個(gè)簡單的滾動抽獎器,接下來繼續(xù)寫一個(gè)簡單的轉(zhuǎn)盤抽獎器。
Tkinter 實(shí)現(xiàn)滾動抽獎器參考:http://chabaoo.cn/article/177913.htm
滾動抽獎器與點(diǎn)名的場景相似,是從一群人中抽出中獎的人,獎品是提前確定了的,抽獎只是確定中獎的人是誰。這種場景比較適合年會抽獎,獎品的種類和數(shù)量已經(jīng)確定了,通過抽獎來抽出中獎人員,一個(gè)獎品對應(yīng)一次抽獎,直到獎品抽完為止。
還有一種場景是只固定了獎品種類,數(shù)量不受限制,有參與資格的人都可以抽獎,可能所有人都抽中了“特等獎”,也可能所有人都抽到了“謝謝參與”,最終發(fā)出多少獎品在抽獎前沒法確定。這種場景比較適合使用“大轉(zhuǎn)盤”抽獎器。
一、使用Tkinter實(shí)現(xiàn)滾動抽獎器的步驟
1. 界面搭建
首先需要搭建一個(gè)簡單的 GUI 界面,效果如下圖(參考)。

首先創(chuàng)建一個(gè)大小適合的窗口,使用 Tkinter.Tk() 方法創(chuàng)建并返回一個(gè)窗口對象 window 。
使用 window 對象的 geometry(widthxheight+x+y) 方法設(shè)置窗口的大小,geometry() 方法中的參數(shù)格式為 widthxheight+x+y,如 '500x290+250+150',width 是窗口的寬度,height 是窗口的高度,中間使用乘號連接,如果敲不出這個(gè)符號,可以去源碼中復(fù)制,x 和 y 用于設(shè)置窗口離電腦屏幕左上角的距離。
2. 設(shè)置轉(zhuǎn)盤的內(nèi)容
使用轉(zhuǎn)盤抽獎時(shí),點(diǎn)擊開始后,轉(zhuǎn)到不同方向?qū)?yīng)不同的獎品種類,所以要設(shè)置每個(gè)方向顯示不同的內(nèi)容。
使用 Tkinter 中的 Label 類,實(shí)例化 Label 的對象來顯示文字。
實(shí)例化 Label 時(shí),第一個(gè)參數(shù)必須是 Tkinter 窗口對象 window,然后通過 text 設(shè)置顯示的內(nèi)容。每個(gè) Label 顯示的內(nèi)容都是固定不變的,所以可以一開始就寫死。然后使用關(guān)鍵字參數(shù)的方式,根據(jù)需要設(shè)置顯示框大小,背景顏色,顯示字體等,再通過 Label 對象的 place() 方法設(shè)置它相對于窗口左上角的位置。
在這個(gè)轉(zhuǎn)盤抽獎器中,我分了8個(gè)不同的方向,8個(gè)區(qū)域,所以需要8個(gè) Label 。在這8個(gè)標(biāo)簽中,除了顯示的內(nèi)容和位置不一樣,其他的設(shè)置都是一樣的,所以將添加標(biāo)簽的步驟封裝成一個(gè)函數(shù),創(chuàng)建標(biāo)簽時(shí)更方便。
3. 設(shè)置開始按鈕
在界面中,需要一個(gè)“開始”按鈕,用來開始抽獎。轉(zhuǎn)盤抽獎是點(diǎn)擊開始后,抽獎界面開始轉(zhuǎn)動,速度由快到慢,直到自動停止,最后停止的區(qū)域就是中獎的區(qū)域,所以不用“停止”按鈕。
使用 Tkinter 中的 Button 類,實(shí)例化 Button 的對象來創(chuàng)建“開始”按鈕。
實(shí)例化 Button 時(shí),第一個(gè)參數(shù)也必須是 Tkinter 窗口對象 window,然后根據(jù)需要設(shè)置按鈕大小,背景顏色,顯示字體等,最后還是使用 place() 方法設(shè)置它相對于的窗口左上角的位置。
當(dāng)點(diǎn)擊按鈕時(shí),開始抽獎,定義好處理抽獎邏輯的函數(shù),用匿名函數(shù)的方式傳給 Button 中的 command ,將點(diǎn)擊按鈕和抽獎邏輯處理函數(shù)關(guān)聯(lián)到一起。
二、抽獎器代碼實(shí)現(xiàn)和效果展示
按照上面分析的步驟依次實(shí)現(xiàn),完整代碼如下。
# 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(' 轉(zhuǎn) 盤 抽 獎 器')
bg_label = Label(window, width=80, height=24, bg='#ECf5FF')
bg_label.place(anchor=NW, x=0, y=0)
label1 = create_label('風(fēng)清揚(yáng)', 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()
當(dāng)點(diǎn)擊開始抽獎后,抽獎界面開始轉(zhuǎn)動,直到自動停止才算一次抽獎結(jié)束。如果第一次抽獎還沒有結(jié)束,點(diǎn)了第二次(或很多次)抽獎,會有多次抽獎并行運(yùn)行,那樣會有很多次轉(zhuǎn)動重疊到一起,相互干擾,抽獎器就失效了。所以在代碼中設(shè)置了一個(gè)全局變量 is_run,表示抽獎器是否還在運(yùn)行中,如果還在運(yùn)行中,就不會進(jìn)行下一次抽獎。
在抽獎器轉(zhuǎn)動時(shí),速度是由快變慢的,所以設(shè)置了一個(gè)列表來控制轉(zhuǎn)動的延遲時(shí)間,這個(gè)時(shí)間列表可以分多段,每一段可以是等差數(shù)列,不過差值設(shè)置越來越大。
點(diǎn)擊開始按鈕,開始轉(zhuǎn)動時(shí),代碼中已經(jīng)確定了轉(zhuǎn)到哪個(gè)位置(中獎類型),轉(zhuǎn)到哪個(gè)位置是由轉(zhuǎn)動的次數(shù)決定的,轉(zhuǎn)動次數(shù)也是從一個(gè)列表中取。轉(zhuǎn)盤抽獎不會設(shè)置停在每個(gè)區(qū)域的概率都一樣(那樣意味著每種獎的中獎概率相同),所以,從列表中取轉(zhuǎn)動次數(shù)時(shí),先根據(jù)需要設(shè)置好概率的大小,使用 random 模塊中的 choices 就可以完成設(shè)置。
random 模塊使用參考: http://chabaoo.cn/article/66368.htm
最后的抽獎器效果如下:

總結(jié)
以上所述是小編給大家介紹的Python使用Tkinter實(shí)現(xiàn)滾動轉(zhuǎn)盤抽獎器的步驟詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
Python?OpenCV形態(tài)學(xué)運(yùn)算示例詳解
這篇文章主要為大家介紹了OpenCV中的幾個(gè)形態(tài)學(xué)運(yùn)算,例如:腐蝕&膨脹、開&閉運(yùn)算、梯度運(yùn)算、頂帽運(yùn)算黑帽運(yùn)算,感興趣的可以了解一下2022-04-04
Python中用于去除空格的三個(gè)函數(shù)的使用小結(jié)
這篇文章主要介紹了Python中用于去除空格的三個(gè)函數(shù)的使用小結(jié),對strip()和lstrip()和rstrip()這三個(gè)函數(shù)做了簡單的講解,需要的朋友可以參考下2015-04-04
Python?正則表達(dá)式基礎(chǔ)知識點(diǎn)及實(shí)例
在本篇文章里小編給大家整理了關(guān)于Python正則表達(dá)式的一些基礎(chǔ)知識點(diǎn)以及相關(guān)用法實(shí)例內(nèi)容,需要的朋友們可以參考下。2021-12-12
Python學(xué)習(xí)筆記之Zip和Enumerate用法實(shí)例分析
這篇文章主要介紹了Python學(xué)習(xí)筆記之Zip和Enumerate用法,結(jié)合實(shí)例形式分析了Zip和Enumerate的功能、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-08-08
Python實(shí)現(xiàn)一個(gè)自助取數(shù)查詢工具
在數(shù)據(jù)生產(chǎn)應(yīng)用部門,取數(shù)分析是一個(gè)很常見的需求,實(shí)際上業(yè)務(wù)人員需求時(shí)刻變化,最高效的方式是讓業(yè)務(wù)部門自己來取,減少不必要的重復(fù)勞動,本文介紹如何用Python實(shí)現(xiàn)一個(gè)自助取數(shù)查詢工具2021-06-06
Python爬取YY評級分?jǐn)?shù)并保存數(shù)據(jù)實(shí)現(xiàn)過程解析
這篇文章主要介紹了Python爬取YY評級分?jǐn)?shù)并保存數(shù)據(jù)實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06

