Python使用Tkinter實(shí)現(xiàn)滾動(dòng)抽獎(jiǎng)器效果
年底,抽獎(jiǎng)這個(gè)話題很多人都會(huì)討論,都希望可以中獎(jiǎng)。
接下來(lái)我就使用 Python 中的 Tkinter 模塊來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的滾動(dòng)抽獎(jiǎng)器。
一、Tkinter簡(jiǎn)介
Tkinter 是 Python 的標(biāo)準(zhǔn) GUI(Graphical User Interface,圖形用戶接口)庫(kù),Python 使用 Tkinter 可以快速地創(chuàng)建 GUI 應(yīng)用程序。
在 Python2 和 Python3 中,Tkinter 都在標(biāo)準(zhǔn)庫(kù)中,無(wú)需安裝即可使用。在 Python2 中,這個(gè)庫(kù)叫 Tkinter ,在 Python3 中,這個(gè)庫(kù)叫 tkinter ,首字母大小寫不相同,在導(dǎo)包時(shí)需要注意。
雖然 Python 的官網(wǎng)已經(jīng)宣布,2020年4月,Python2 會(huì)退休,但是在很多公司,依然在使用 Python2 ,所以本文的代碼也會(huì)兼容 Python2 和 Python3 。
Tkinter 提供了非常豐富的圖形界面功能,實(shí)現(xiàn)一個(gè)抽獎(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(自定義的對(duì)象名)。
使用 window 對(duì)象的 geometry(widthxheight+x+y) 方法來(lái)設(shè)置窗口的大小,geometry() 方法中的參數(shù)必須按照格式傳入才行,參數(shù)格式為 widthxheight+x+y,如 '405x320+250+15',width 是窗口的寬度,height 是窗口的高度,中間使用乘號(hào)連接,如果敲不出這個(gè)符號(hào),可以去源碼中復(fù)制,x 和 y 用于設(shè)置窗口離電腦屏幕左上角的距離。
2. 設(shè)置文字顯示框
抽獎(jiǎng)時(shí),要在界面上快速地滾動(dòng)顯示當(dāng)前的中獎(jiǎng)?wù)咝彰砸O(shè)置一個(gè)文字顯示框。
使用 Tkinter 中的 Label 類(不一定用 Label ,實(shí)現(xiàn)方法有很多),實(shí)例化 Label 的對(duì)象來(lái)顯示文字,充當(dāng)顯示框。Label 標(biāo)簽?zāi)J(rèn)不可點(diǎn)擊不可選中也不可編輯,用來(lái)顯示比較少的內(nèi)容(人名)是比較適合的。
要設(shè)置 Label 顯示的文字,需要實(shí)例化一個(gè) StringVar 類的對(duì)象,使用 StringVar 中的 value 傳入初始顯示的內(nèi)容。在 Label 中 將 StringVar 對(duì)象傳給 textvariable ,這樣 Label 和 StringVar 就一一對(duì)應(yīng)起來(lái)了。
實(shí)例化 Label 時(shí),第一個(gè)參數(shù)必須是 Tkinter 窗口對(duì)象 window,然后使用關(guān)鍵字參數(shù)的方式,根據(jù)需要設(shè)置顯示框大小,背景顏色,顯示字體等,再通過(guò) Label 對(duì)象的 place() 方法設(shè)置它相對(duì)于窗口左上角的位置。
需要多個(gè) Label 時(shí),如法炮制。
3. 設(shè)置按鈕
在界面中,需要兩個(gè)按鈕,一個(gè)“開始”按鈕,一個(gè)“結(jié)束”按鈕,用來(lái)控制抽獎(jiǎng)的開始和停止。(當(dāng)然也可以設(shè)置成同一個(gè)按鈕,實(shí)現(xiàn)方法也差不多)
使用 Tkinter 中的 Button 類,實(shí)例化 Button 的對(duì)象來(lái)創(chuàng)建按鈕。
實(shí)例化 Button 時(shí),第一個(gè)參數(shù)也必須是 Tkinter 窗口對(duì)象 window,然后根據(jù)需要設(shè)置按鈕大小,背景顏色,顯示字體等,最后還是使用 place() 方法設(shè)置它相對(duì)于的窗口左上角的位置。
當(dāng)點(diǎn)擊按鈕時(shí),抽獎(jiǎng)器要開始抽獎(jiǎng)或結(jié)束抽獎(jiǎng),也就是說(shuō)點(diǎn)擊按鈕時(shí),要觸發(fā)某件事。觸發(fā)的事件可以使用函數(shù)來(lái)實(shí)現(xiàn),然后用匿名函數(shù)的方式傳給 Button 中的 command ,將點(diǎn)擊按鈕和事件處理關(guān)聯(lián)到一起。
三、抽獎(jiǎng)器代碼實(shí)現(xiàn)和效果展示
根據(jù)上面的簡(jiǎn)單分析,代碼按步驟依次來(lái)實(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 data = ['風(fēng)清揚(yáng)', '無(wú)崖子', '東邪', '西毒', '南帝', '北丐'] going = True is_run = False def lottery_roll(var1, var2): global going show_member = random.choice(data) var1.set(show_member) if going: window.after(50, lottery_roll, var1, var2) else: var2.set('恭喜 {} ?。?!'.format(show_member)) going = True return def lottery_start(var1, var2): global is_run if is_run: return is_run = True var2.set('幸運(yùn)兒是你嗎。。。') lottery_roll(var1, var2) def lottery_end(): global going, is_run if is_run: going = False is_run = False if __name__ == '__main__': window = Tkinter.Tk() window.geometry('405x320+250+15') window.title(' 滾 動(dòng) 抽 獎(jiǎng) 器') bg_label = Label(window, width=70, height=24, bg='#ECf5FF') bg_label.place(anchor=NW, x=0, y=0) var1 = StringVar(value='即 將 開 始') show_label1 = Label(window, textvariable=var1, justify='left', anchor=CENTER, width=17, height=3, bg='#BFEFFF', font='楷體 -40 bold', foreground='black') show_label1.place(anchor=NW, x=21, y=20) var2 = StringVar(value='幸運(yùn)兒是你嗎。。。') show_label2 = Label(window, textvariable=var2, justify='left', anchor=CENTER, width=38, height=3, bg='#ECf5FF', font='楷體 -18 bold', foreground='red') show_label2.place(anchor=NW, x=21, y=240) button1 = Button(window, text='開始', command=lambda: lottery_start(var1, var2), width=14, height=2, bg='#A8A8A8', font='宋體 -18 bold') button1.place(anchor=NW, x=20, y=175) button2 = Button(window, text='結(jié)束', command=lambda: lottery_end(), width=14, height=2, bg='#A8A8A8', font='宋體 -18 bold') button2.place(anchor=NW, x=232, y=175) window.mainloop()
代碼中主要是按照創(chuàng)建窗口,創(chuàng)建顯示框,創(chuàng)建按鈕,編寫抽獎(jiǎng)函數(shù)等步驟來(lái)實(shí)現(xiàn)。
有一個(gè)點(diǎn)需要注意一下,當(dāng)?shù)谝淮纬楠?jiǎng)還沒(méi)有(點(diǎn)擊)結(jié)束時(shí),如果點(diǎn)了第二次(或很多次)抽獎(jiǎng),會(huì)有多次抽獎(jiǎng)并行運(yùn)行,點(diǎn)結(jié)束時(shí),無(wú)法使抽獎(jiǎng)器正常結(jié)束,甚至造成程序出錯(cuò)。所以在代碼中設(shè)置了兩個(gè)全局變量 going 和 is_run,分別表示是否可以繼續(xù)滾動(dòng)(遞歸)顯示下一個(gè)名額和當(dāng)前抽獎(jiǎng)器是否在運(yùn)行,通過(guò)它們控制同時(shí)只有一次抽獎(jiǎng)在運(yùn)行。
最后的抽獎(jiǎng)器效果如下:
這個(gè)程序可以用于抽獎(jiǎng),還可以用于點(diǎn)名等,不同使用場(chǎng)景只需要簡(jiǎn)單修改就可以了。
總結(jié)
以上所述是小編給大家介紹的Python使用Tkinter實(shí)現(xiàn)滾動(dòng)抽獎(jiǎng)器效果,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
Python range、enumerate和zip函數(shù)用法詳解
這篇文章主要介紹了Python range、enumerate和zip函數(shù)用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09Pytorch使用DataLoader實(shí)現(xiàn)批量加載數(shù)據(jù)
這篇文章主要介紹了Pytorch使用DataLoader實(shí)現(xiàn)批量加載數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02python3 unicode列表轉(zhuǎn)換為中文的實(shí)例
今天小編就為大家分享一篇python3 unicode列表轉(zhuǎn)換為中文的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10python標(biāo)準(zhǔn)算法實(shí)現(xiàn)數(shù)組全排列的方法
這篇文章主要介紹了python標(biāo)準(zhǔn)算法實(shí)現(xiàn)數(shù)組全排列的方法,實(shí)例分析了全排列的原理與Python實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-03-03django 中使用DateTime常用的時(shí)間查詢方式
今天小編就為大家分享一篇django 中使用DateTime常用的時(shí)間查詢方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12Python中使用實(shí)現(xiàn)輸出哈沙德數(shù)的多種方法小結(jié)
哈沙德數(shù)(Harshad?Number),又稱Niven數(shù),是指一個(gè)自然數(shù),它可以被它的各位數(shù)字之和整除,本文將探討如何使用多種不同的方法來(lái)判斷一個(gè)數(shù)字是否是哈沙德數(shù),感興趣的可以了解下2024-01-01python數(shù)據(jù)處理——對(duì)pandas進(jìn)行數(shù)據(jù)變頻或插值實(shí)例
這篇文章主要介紹了python數(shù)據(jù)處理——對(duì)pandas進(jìn)行數(shù)據(jù)變頻或插值實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04