年底,抽獎這個話題很多人都會討論,都希望可以中獎。
接下來我就使用 Python 中的 Tkinter 模塊來實現一個簡單的滾動抽獎器。
一、Tkinter簡介
Tkinter 是 Python 的標準 GUI(Graphical User Interface,圖形用戶接口)庫,Python 使用 Tkinter 可以快速地創建 GUI 應用程序。
在 Python2 和 Python3 中,Tkinter 都在標準庫中,無需安裝即可使用。在 Python2 中,這個庫叫 Tkinter ,在 Python3 中,這個庫叫 tkinter ,首字母大小寫不相同,在導包時需要注意。
雖然 Python 的官網已經宣布,2020年4月,Python2 會退休,但是在很多公司,依然在使用 Python2 ,所以本文的代碼也會兼容 Python2 和 Python3 。
Tkinter 提供了非常豐富的圖形界面功能,實現一個抽獎器,只需要用到里面很少的一部分功能。
二、使用Tkinter實現滾動抽獎器的步驟
1. 界面搭建
首先需要搭建一個簡單的 GUI 界面,效果如下圖(參考)。
首先創建一個大小適合的窗口,使用 Tkinter.Tk() 方法即可創建并返回一個窗口對象 window(自定義的對象名)。
使用 window 對象的 geometry(widthxheight+x+y) 方法來設置窗口的大小,geometry() 方法中的參數必須按照格式傳入才行,參數格式為 widthxheight+x+y,如 '405x320+250+15',width 是窗口的寬度,height 是窗口的高度,中間使用乘號連接,如果敲不出這個符號,可以去源碼中復制,x 和 y 用于設置窗口離電腦屏幕左上角的距離。
2. 設置文字顯示框
抽獎時,要在界面上快速地滾動顯示當前的中獎者姓名,所以要設置一個文字顯示框。
使用 Tkinter 中的 Label 類(不一定用 Label ,實現方法有很多),實例化 Label 的對象來顯示文字,充當顯示框。Label 標簽默認不可點擊不可選中也不可編輯,用來顯示比較少的內容(人名)是比較適合的。
要設置 Label 顯示的文字,需要實例化一個 StringVar 類的對象,使用 StringVar 中的 value 傳入初始顯示的內容。在 Label 中 將 StringVar 對象傳給 textvariable ,這樣 Label 和 StringVar 就一一對應起來了。
實例化 Label 時,第一個參數必須是 Tkinter 窗口對象 window,然后使用關鍵字參數的方式,根據需要設置顯示框大小,背景顏色,顯示字體等,再通過 Label 對象的 place() 方法設置它相對于窗口左上角的位置。
需要多個 Label 時,如法炮制。
3. 設置按鈕
在界面中,需要兩個按鈕,一個“開始”按鈕,一個“結束”按鈕,用來控制抽獎的開始和停止。(當然也可以設置成同一個按鈕,實現方法也差不多)
使用 Tkinter 中的 Button 類,實例化 Button 的對象來創建按鈕。
實例化 Button 時,第一個參數也必須是 Tkinter 窗口對象 window,然后根據需要設置按鈕大小,背景顏色,顯示字體等,最后還是使用 place() 方法設置它相對于的窗口左上角的位置。
當點擊按鈕時,抽獎器要開始抽獎或結束抽獎,也就是說點擊按鈕時,要觸發某件事。觸發的事件可以使用函數來實現,然后用匿名函數的方式傳給 Button 中的 command ,將點擊按鈕和事件處理關聯到一起。
三、抽獎器代碼實現和效果展示
根據上面的簡單分析,代碼按步驟依次來實現,完整代碼如下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
# 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 = [ '風清揚' , '無崖子' , '東邪' , '西毒' , '南帝' , '北丐' ] 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 ( '恭喜 {} ?。。?#39; . format (show_member)) going = True return def lottery_start(var1, var2): global is_run if is_run: return is_run = True var2. set ( '幸運兒是你嗎。。。' ) 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( ' 滾 動 抽 獎 器' ) 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 = '幸運兒是你嗎。。。' ) 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 = '結束' , command = lambda : lottery_end(), width = 14 , height = 2 , bg = '#A8A8A8' , font = '宋體 -18 bold' ) button2.place(anchor = NW, x = 232 , y = 175 ) window.mainloop() |
代碼中主要是按照創建窗口,創建顯示框,創建按鈕,編寫抽獎函數等步驟來實現。
有一個點需要注意一下,當第一次抽獎還沒有(點擊)結束時,如果點了第二次(或很多次)抽獎,會有多次抽獎并行運行,點結束時,無法使抽獎器正常結束,甚至造成程序出錯。所以在代碼中設置了兩個全局變量 going 和 is_run,分別表示是否可以繼續滾動(遞歸)顯示下一個名額和當前抽獎器是否在運行,通過它們控制同時只有一次抽獎在運行。
最后的抽獎器效果如下:
這個程序可以用于抽獎,還可以用于點名等,不同使用場景只需要簡單修改就可以了。
總結
以上所述是小編給大家介紹的Python使用Tkinter實現滾動抽獎器效果,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!
原文鏈接:https://blog.csdn.net/weixin_43790276/article/details/103811660