Python使用Tkinter實(shí)現(xiàn)轉(zhuǎn)盤(pán)抽獎(jiǎng)器的步驟詳解
我使用 Python 中的 Tkinter 模塊實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的滾動(dòng)抽獎(jiǎng)器,接下來(lái)繼續(xù)寫(xiě)一個(gè)簡(jiǎn)單的轉(zhuǎn)盤(pán)抽獎(jiǎng)器。
Tkinter 實(shí)現(xiàn)滾動(dòng)抽獎(jiǎng)器參考:http://www.dbjr.com.cn/article/177913.htm
滾動(dòng)抽獎(jiǎng)器與點(diǎn)名的場(chǎng)景相似,是從一群人中抽出中獎(jiǎng)的人,獎(jiǎng)品是提前確定了的,抽獎(jiǎng)只是確定中獎(jiǎng)的人是誰(shuí)。這種場(chǎng)景比較適合年會(huì)抽獎(jiǎng),獎(jiǎng)品的種類(lèi)和數(shù)量已經(jīng)確定了,通過(guò)抽獎(jiǎng)來(lái)抽出中獎(jiǎng)人員,一個(gè)獎(jiǎng)品對(duì)應(yīng)一次抽獎(jiǎng),直到獎(jiǎng)品抽完為止。
還有一種場(chǎng)景是只固定了獎(jiǎng)品種類(lèi),數(shù)量不受限制,有參與資格的人都可以抽獎(jiǎng),可能所有人都抽中了“特等獎(jiǎng)”,也可能所有人都抽到了“謝謝參與”,最終發(fā)出多少獎(jiǎng)品在抽獎(jiǎng)前沒(méi)法確定。這種場(chǎng)景比較適合使用“大轉(zhuǎn)盤(pán)”抽獎(jiǎng)器。
一、使用Tkinter實(shí)現(xiàn)滾動(dòng)抽獎(jiǎng)器的步驟
1. 界面搭建
首先需要搭建一個(gè)簡(jiǎn)單的 GUI 界面,效果如下圖(參考)。
首先創(chuàng)建一個(gè)大小適合的窗口,使用 Tkinter.Tk() 方法創(chuàng)建并返回一個(gè)窗口對(duì)象 window 。
使用 window 對(duì)象的 geometry(widthxheight+x+y) 方法設(shè)置窗口的大小,geometry() 方法中的參數(shù)格式為 widthxheight+x+y,如 '500x290+250+150',width 是窗口的寬度,height 是窗口的高度,中間使用乘號(hào)連接,如果敲不出這個(gè)符號(hào),可以去源碼中復(fù)制,x 和 y 用于設(shè)置窗口離電腦屏幕左上角的距離。
2. 設(shè)置轉(zhuǎn)盤(pán)的內(nèi)容
使用轉(zhuǎn)盤(pán)抽獎(jiǎng)時(shí),點(diǎn)擊開(kāi)始后,轉(zhuǎn)到不同方向?qū)?yīng)不同的獎(jiǎng)品種類(lèi),所以要設(shè)置每個(gè)方向顯示不同的內(nèi)容。
使用 Tkinter 中的 Label 類(lèi),實(shí)例化 Label 的對(duì)象來(lái)顯示文字。
實(shí)例化 Label 時(shí),第一個(gè)參數(shù)必須是 Tkinter 窗口對(duì)象 window,然后通過(guò) text 設(shè)置顯示的內(nèi)容。每個(gè) Label 顯示的內(nèi)容都是固定不變的,所以可以一開(kāi)始就寫(xiě)死。然后使用關(guān)鍵字參數(shù)的方式,根據(jù)需要設(shè)置顯示框大小,背景顏色,顯示字體等,再通過(guò) Label 對(duì)象的 place() 方法設(shè)置它相對(duì)于窗口左上角的位置。
在這個(gè)轉(zhuǎn)盤(pán)抽獎(jiǎng)器中,我分了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è)置開(kāi)始按鈕
在界面中,需要一個(gè)“開(kāi)始”按鈕,用來(lái)開(kāi)始抽獎(jiǎng)。轉(zhuǎn)盤(pán)抽獎(jiǎng)是點(diǎn)擊開(kāi)始后,抽獎(jiǎng)界面開(kāi)始轉(zhuǎn)動(dòng),速度由快到慢,直到自動(dòng)停止,最后停止的區(qū)域就是中獎(jiǎng)的區(qū)域,所以不用“停止”按鈕。
使用 Tkinter 中的 Button 類(lèi),實(shí)例化 Button 的對(duì)象來(lái)創(chuàng)建“開(kāi)始”按鈕。
實(shí)例化 Button 時(shí),第一個(gè)參數(shù)也必須是 Tkinter 窗口對(duì)象 window,然后根據(jù)需要設(shè)置按鈕大小,背景顏色,顯示字體等,最后還是使用 place() 方法設(shè)置它相對(duì)于的窗口左上角的位置。
當(dāng)點(diǎn)擊按鈕時(shí),開(kāi)始抽獎(jiǎng),定義好處理抽獎(jiǎng)邏輯的函數(shù),用匿名函數(shù)的方式傳給 Button 中的 command ,將點(diǎn)擊按鈕和抽獎(jiǎng)邏輯處理函數(shù)關(guān)聯(lián)到一起。
二、抽獎(jiǎng)器代碼實(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) 盤(pán) 抽 獎(jiǎng) 器') 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('無(wú)崖子', 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='開(kāi) 始', 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)擊開(kāi)始抽獎(jiǎng)后,抽獎(jiǎng)界面開(kāi)始轉(zhuǎn)動(dòng),直到自動(dòng)停止才算一次抽獎(jiǎng)結(jié)束。如果第一次抽獎(jiǎng)還沒(méi)有結(jié)束,點(diǎn)了第二次(或很多次)抽獎(jiǎng),會(huì)有多次抽獎(jiǎng)并行運(yùn)行,那樣會(huì)有很多次轉(zhuǎn)動(dòng)重疊到一起,相互干擾,抽獎(jiǎng)器就失效了。所以在代碼中設(shè)置了一個(gè)全局變量 is_run,表示抽獎(jiǎng)器是否還在運(yùn)行中,如果還在運(yùn)行中,就不會(huì)進(jìn)行下一次抽獎(jiǎng)。
在抽獎(jiǎng)器轉(zhuǎn)動(dòng)時(shí),速度是由快變慢的,所以設(shè)置了一個(gè)列表來(lái)控制轉(zhuǎn)動(dòng)的延遲時(shí)間,這個(gè)時(shí)間列表可以分多段,每一段可以是等差數(shù)列,不過(guò)差值設(shè)置越來(lái)越大。
點(diǎn)擊開(kāi)始按鈕,開(kāi)始轉(zhuǎn)動(dòng)時(shí),代碼中已經(jīng)確定了轉(zhuǎn)到哪個(gè)位置(中獎(jiǎng)?lì)愋?,轉(zhuǎn)到哪個(gè)位置是由轉(zhuǎn)動(dòng)的次數(shù)決定的,轉(zhuǎn)動(dòng)次數(shù)也是從一個(gè)列表中取。轉(zhuǎn)盤(pán)抽獎(jiǎng)不會(huì)設(shè)置停在每個(gè)區(qū)域的概率都一樣(那樣意味著每種獎(jiǎng)的中獎(jiǎng)概率相同),所以,從列表中取轉(zhuǎn)動(dòng)次數(shù)時(shí),先根據(jù)需要設(shè)置好概率的大小,使用 random 模塊中的 choices 就可以完成設(shè)置。
random 模塊使用參考: http://www.dbjr.com.cn/article/66368.htm
最后的抽獎(jiǎng)器效果如下:
總結(jié)
以上所述是小編給大家介紹的Python使用Tkinter實(shí)現(xiàn)滾動(dòng)轉(zhuǎn)盤(pán)抽獎(jiǎng)器的步驟詳解,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
- 如何基于python實(shí)現(xiàn)年會(huì)抽獎(jiǎng)工具
- Python實(shí)現(xiàn)的企業(yè)粉絲抽獎(jiǎng)功能示例
- 詳解用python寫(xiě)一個(gè)抽獎(jiǎng)程序
- python3實(shí)現(xiàn)小球轉(zhuǎn)動(dòng)抽獎(jiǎng)小游戲
- python實(shí)現(xiàn)抽獎(jiǎng)小程序
- python實(shí)現(xiàn)年會(huì)抽獎(jiǎng)程序
- python實(shí)現(xiàn)公司年會(huì)抽獎(jiǎng)程序
- python實(shí)現(xiàn)的簡(jiǎn)單抽獎(jiǎng)系統(tǒng)實(shí)例
- 編寫(xiě)python代碼實(shí)現(xiàn)簡(jiǎn)單抽獎(jiǎng)器
相關(guān)文章
Python?OpenCV形態(tài)學(xué)運(yùn)算示例詳解
這篇文章主要為大家介紹了OpenCV中的幾個(gè)形態(tài)學(xué)運(yùn)算,例如:腐蝕&膨脹、開(kāi)&閉運(yùn)算、梯度運(yùn)算、頂帽運(yùn)算黑帽運(yùn)算,感興趣的可以了解一下2022-04-04Python中用于去除空格的三個(gè)函數(shù)的使用小結(jié)
這篇文章主要介紹了Python中用于去除空格的三個(gè)函數(shù)的使用小結(jié),對(duì)strip()和lstrip()和rstrip()這三個(gè)函數(shù)做了簡(jiǎn)單的講解,需要的朋友可以參考下2015-04-04Python?正則表達(dá)式基礎(chǔ)知識(shí)點(diǎn)及實(shí)例
在本篇文章里小編給大家整理了關(guān)于Python正則表達(dá)式的一些基礎(chǔ)知識(shí)點(diǎn)以及相關(guān)用法實(shí)例內(nèi)容,需要的朋友們可以參考下。2021-12-12Python學(xué)習(xí)筆記之Zip和Enumerate用法實(shí)例分析
這篇文章主要介紹了Python學(xué)習(xí)筆記之Zip和Enumerate用法,結(jié)合實(shí)例形式分析了Zip和Enumerate的功能、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-08-08Python實(shí)現(xiàn)一個(gè)自助取數(shù)查詢工具
在數(shù)據(jù)生產(chǎn)應(yīng)用部門(mén),取數(shù)分析是一個(gè)很常見(jiàn)的需求,實(shí)際上業(yè)務(wù)人員需求時(shí)刻變化,最高效的方式是讓業(yè)務(wù)部門(mén)自己來(lái)取,減少不必要的重復(fù)勞動(dòng),本文介紹如何用Python實(shí)現(xiàn)一個(gè)自助取數(shù)查詢工具2021-06-06如何用python寫(xiě)一個(gè)簡(jiǎn)單的詞法分析器
這篇文章主要介紹了如何用python寫(xiě)一個(gè)簡(jiǎn)單的詞法分析器,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12Python爬取YY評(píng)級(jí)分?jǐn)?shù)并保存數(shù)據(jù)實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了Python爬取YY評(píng)級(jí)分?jǐn)?shù)并保存數(shù)據(jù)實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06