怎么在Python中利用Tkinter實(shí)現(xiàn)一個(gè)轉(zhuǎn)盤抽獎(jiǎng)器-創(chuàng)新互聯(lián)

怎么在Python中利用Tkinter實(shí)現(xiàn)一個(gè)轉(zhuǎn)盤抽獎(jiǎng)器?相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比南通網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式南通網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋南通地區(qū)。費(fèi)用合理售后完善,十余年實(shí)體公司更值得信賴。

一、使用Tkinter實(shí)現(xiàn)滾動(dòng)抽獎(jiǎng)器的步驟

1. 界面搭建

首先需要搭建一個(gè)簡單的 GUI 界面,效果如下圖(參考)。

怎么在Python中利用Tkinter實(shí)現(xiàn)一個(gè)轉(zhuǎn)盤抽獎(jiǎng)器

首先創(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 是窗口的高度,中間使用乘號(hào)連接,如果敲不出這個(gè)符號(hào),可以去源碼中復(fù)制,x 和 y 用于設(shè)置窗口離電腦屏幕左上角的距離。

2. 設(shè)置轉(zhuǎn)盤的內(nèi)容

使用轉(zhuǎn)盤抽獎(jiǎng)時(shí),點(diǎn)擊開始后,轉(zhuǎn)到不同方向?qū)?yīng)不同的獎(jiǎ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)盤抽獎(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è)置開始按鈕

在界面中,需要一個(gè)“開始”按鈕,用來開始抽獎(jiǎng)。轉(zhuǎn)盤抽獎(jiǎng)是點(diǎn)擊開始后,抽獎(jiǎng)界面開始轉(zhuǎn)動(dòng),速度由快到慢,直到自動(dòng)停止,最后停止的區(qū)域就是中獎(jiǎng)的區(qū)域,所以不用“停止”按鈕。

使用 Tkinter 中的 Button 類,實(shí)例化 Button 的對象來創(chuàng)建“開始”按鈕。

實(shí)例化 Button 時(shí),第一個(gè)參數(shù)也必須是 Tkinter 窗口對象 window,然后根據(jù)需要設(shè)置按鈕大小,背景顏色,顯示字體等,最后還是使用 place() 方法設(shè)置它相對于的窗口左上角的位置。

當(dāng)點(diǎn)擊按鈕時(shí),開始抽獎(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) 盤 抽 獎(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('無崖子', 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)擊開始抽獎(jiǎng)后,抽獎(jiǎng)界面開始轉(zhuǎn)動(dòng),直到自動(dòng)停止才算一次抽獎(jiǎng)結(jié)束。如果第一次抽獎(jiǎng)還沒有結(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è)列表來控制轉(zhuǎn)動(dòng)的延遲時(shí)間,這個(gè)時(shí)間列表可以分多段,每一段可以是等差數(shù)列,不過差值設(shè)置越來越大。

點(diǎn)擊開始按鈕,開始轉(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)盤抽獎(jiǎng)不會(huì)設(shè)置停在每個(gè)區(qū)域的概率都一樣(那樣意味著每種獎(jiǎng)的中獎(jiǎng)概率相同),所以,從列表中取轉(zhuǎn)動(dòng)次數(shù)時(shí),先根據(jù)需要設(shè)置好概率的大小,使用 random 模塊中的 choices 就可以完成設(shè)置。

看完上述內(nèi)容,你們掌握怎么在Python中利用Tkinter實(shí)現(xiàn)一個(gè)轉(zhuǎn)盤抽獎(jiǎng)器的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道,感謝各位的閱讀!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)站欄目:怎么在Python中利用Tkinter實(shí)現(xiàn)一個(gè)轉(zhuǎn)盤抽獎(jiǎng)器-創(chuàng)新互聯(lián)
文章來源:http://www.muchs.cn/article44/piche.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、自適應(yīng)網(wǎng)站、做網(wǎng)站、網(wǎng)站營銷、商城網(wǎng)站、網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司