欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python使用Tkinter實(shí)現(xiàn)轉(zhuǎn)盤(pán)抽獎(jiǎng)器的步驟詳解

 更新時(shí)間:2020年01月06日 11:37:28   作者:Python碎片  
這篇文章主要介紹了Python使用Tkinter實(shí)現(xiàn)轉(zhuǎn)盤(pán)抽獎(jiǎng)器,,本文分場(chǎng)景通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

我使用 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)注明出處,謝謝!

相關(guān)文章

  • Python?OpenCV形態(tài)學(xué)運(yù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-04
  • Python中用于去除空格的三個(gè)函數(shù)的使用小結(jié)

    Python中用于去除空格的三個(gè)函數(shù)的使用小結(jié)

    這篇文章主要介紹了Python中用于去除空格的三個(gè)函數(shù)的使用小結(jié),對(duì)strip()和lstrip()和rstrip()這三個(gè)函數(shù)做了簡(jiǎn)單的講解,需要的朋友可以參考下
    2015-04-04
  • python2中的中文亂碼

    python2中的中文亂碼

    這篇文章主要介紹了python2中的中文亂碼問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Python?正則表達(dá)式基礎(chǔ)知識(shí)點(diǎn)及實(shí)例

    Python?正則表達(dá)式基礎(chǔ)知識(shí)點(diǎn)及實(shí)例

    在本篇文章里小編給大家整理了關(guān)于Python正則表達(dá)式的一些基礎(chǔ)知識(shí)點(diǎn)以及相關(guān)用法實(shí)例內(nèi)容,需要的朋友們可以參考下。
    2021-12-12
  • Python學(xué)習(xí)筆記之Zip和Enumerate用法實(shí)例分析

    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ù)查詢工具

    Python實(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 Asyncio調(diào)度原理詳情

    Python Asyncio調(diào)度原理詳情

    這篇文章主要介紹了Python Asyncio調(diào)度原理詳情,Python.Asyncio是一個(gè)大而全的庫(kù),它包括很多功能,而跟核心調(diào)度相關(guān)的邏輯除了三種可等待對(duì)象外,還有其它一些功能,它們分別位于runners.py,base_event.py,event.py三個(gè)文件中
    2022-06-06
  • python實(shí)現(xiàn)TCP文件傳輸

    python實(shí)現(xiàn)TCP文件傳輸

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)TCP文件傳輸,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • 如何用python寫(xiě)一個(gè)簡(jiǎn)單的詞法分析器

    如何用python寫(xiě)一個(gè)簡(jiǎn)單的詞法分析器

    這篇文章主要介紹了如何用python寫(xiě)一個(gè)簡(jiǎn)單的詞法分析器,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • Python爬取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ò)程解析

    這篇文章主要介紹了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

最新評(píng)論