一、概況
文章主要用Python程序寫一個課堂抽獎式點名器,用到的是Python中的GUI編程,思路是使用tkinter編寫界面,使用3個Label組件和多線程技術實現學生名單的滾動顯示。
我們大概做的功能有二個:
(1)隨機點名
(2)日志記錄
二、頁面搭建
首先我們先簡單的把界面搭建出來,代碼如下:
import tkinter as tk root = tkinter.Tk() # 窗口標題 root.title('隨機提問') # 窗口初始大小和位置
root.geometry('520x360+250+200')
# 不允許改變窗口大小
root.resizable(False, False)
def closeWindow(): # 關閉程序時執行的函數代碼,停止滾動顯示學生名單 def take(): 從數據庫中讀取學生名單函數 def switch(): # 滾動顯示函數 def btnStartClick(): # 每次單擊“開始”按鈕啟動新線程函數 def btnStopClick(): # 單擊“停”按鈕結束滾動顯示函數 root.mainloop() # 啟動tkinter主程序
三、數據獲取
在班級我們一般都會有個班級人員名單(xxx.xlsx)。當我們初始化程序的時候,我們把本地的數據讀取到程序中。
通過xlrd模塊可以把數據讀取到程序中,但是我們需要安裝這個模塊:
pip install xlrd
代碼如下:
def take(): xlsfile = r"D:\花名冊(5).xlsx"# 打開指定路徑中的xls文件 book = xlrd.open_workbook(xlsfile)#得到Excel文件的book對象,實例化對象 sheet0 = book.sheet_by_index(0) # 通過sheet索引獲得sheet對象 nrows = sheet0.nrows # 獲取行總數 ncols = sheet0.ncols #獲取列總數 students=[] for i in range(nrows): students.append(sheet0.cell_value(i, 1)) # 變量,用來控制是否滾動顯示學生名單 root.flag = False
四、點名實現
def btnStartClick(): # 每次單擊“開始”按鈕啟動新線程 t = threading.Thread(target=switch) t.start() btnStart['state'] = 'disabled' btnStop['state'] = 'normal' btnStart = tkinter.Button(root, text='開始', command=btnStartClick) btnStart.place(x=60, y=20, width=160, height=40) def btnStopClick(): # 單擊“停”按鈕結束滾動顯示 root.flag = False time.sleep(0.3) tkinter.messagebox.showinfo('恭喜', '本次中獎:'+lbSecond['text']) savedesc(lbSecond['text']) btnStart['state'] = 'normal' btnStop['state'] = 'disabled' btnStop = tkinter.Button(root, text='停', command=btnStopClick) btnStop['state'] = 'disabled' btnStop.place(x=300, y=20, width=160, height=40) # 用來滾動顯示學生名單的3個Label組件 # 可以根據需要進行添加,但要修改上面的線程函數代碼 lbFirst = tkinter.Label(root, text='') lbFirst.place(x=160, y=120, width=200, height=40) lbSecond = tkinter.Label(root, text='') lbSecond['fg'] = 'red' lbSecond.place(x=160, y=180, width=200, height=40)
lbThird = tkinter.Label(root, text='')
lbThird.place(x=160, y=240, width=200, height=40)
我們使用13個Label組件和多線程技術實現學生名單的滾動顯示,其中紅色Label組件,是表示中獎名單
圖片展示:

五、日志實現
日志主要為了記錄提問的人、什么時候提問的,然后把這些信息寫入到本地。
實現函數如下:
def gettime(): d = datetime.datetime.now() day = d.weekday() + 1 return time.strftime('%Y-%m-%d', time.localtime(time.time())) + " 星期" + str(day) def savedesc(desc): with open('name_tiwen.txt', 'a', encoding='utf-8') as f: f.write(gettime() + "\n" + desc+"\n")
記錄效果如下:

六、其他
以上就是我這個程序的基本功能,另外我還添加了程序的背景圖的函數代碼
image2 =Image.open(r'C:\Users\86152\Pictures\b.jpg') background_image = ImageTk.PhotoImage(image2) background_label = tkinter.Label(root,image=background_image)
效果圖如下:

完整代碼如下:
import tkinter import tkinter.messagebox import random import threading import itertools import time import datetime import xlrd from PIL import Image from PIL import ImageTk root = tkinter.Tk() # 窗口標題 root.title('隨機提問') # 窗口初始大小和位置 root.geometry('520x360+400+300') image2 =Image.open(r'C:\Users\86152\Pictures\b.jpg') background_image = ImageTk.PhotoImage(image2) background_label = tkinter.Label(root,image=background_image) background_label.place(x=0, y=0, relwidth=1, relheight=1) # 允許改變窗口大小 root.resizable(True, True) # 關閉程序時執行的函數代碼,停止滾動顯示學生名單 def closeWindow(): root.flag = False time.sleep(0.1) root.destroy() root.protocol('WM_DELETE_WINDOW', closeWindow) # 模擬學生名單,可以加上數據庫訪問接口,從數據庫中讀取學生名單 xlsfile = r"D:\19信計2班花名冊(5).xlsx"# 打開指定路徑中的xls文件 book = xlrd.open_workbook(xlsfile)#得到Excel文件的book對象,實例化對象 sheet0 = book.sheet_by_index(0) # 通過sheet索引獲得sheet對象 nrows = sheet0.nrows # 獲取行總數 ncols = sheet0.ncols #獲取列總數 students=[] for i in range(nrows): students.append(sheet0.cell_value(i, 1)) # 變量,用來控制是否滾動顯示學生名單 root.flag = False def switch(): root.flag = True # 隨機打亂學生名單 t = students[:] random.shuffle(t) t = itertools.cycle(t) while root.flag: # 滾動顯示 lbFirst['text'] = lbSecond['text'] lbSecond['text'] = lbThird['text'] lbThird['text'] = next(t) # 數字可以修改,控制滾動速度 time.sleep(0.05) def btnStartClick(): # 每次單擊“開始”按鈕啟動新線程 t = threading.Thread(target=switch) t.start() btnStart['state'] = 'disabled' btnStop['state'] = 'normal' btnStart = tkinter.Button(root, text='開始', command=btnStartClick) btnStart.place(x=60, y=20, width=160, height=40) def btnStopClick(): # 單擊“停”按鈕結束滾動顯示 root.flag = False time.sleep(0.3) tkinter.messagebox.showinfo('恭喜', '本次中獎:'+lbSecond['text']) savedesc(lbSecond['text']) btnStart['state'] = 'normal' btnStop['state'] = 'disabled' btnStop = tkinter.Button(root, text='停', command=btnStopClick) btnStop['state'] = 'disabled' btnStop.place(x=300, y=20, width=160, height=40) # 用來滾動顯示學生名單的3個Label組件 # 可以根據需要進行添加,但要修改上面的線程函數代碼 lbFirst = tkinter.Label(root, text='') lbFirst.place(x=160, y=120, width=200, height=40) # 紅色Label組件,表示中獎名單 lbSecond = tkinter.Label(root, text='') lbSecond['fg'] = 'red' lbSecond.place(x=160, y=180, width=200, height=40)
lbThird = tkinter.Label(root, text='')
lbThird.place(x=160, y=240, width=200, height=40) def gettime(): d = datetime.datetime.now() day = d.weekday() + 1 return time.strftime('%Y-%m-%d', time.localtime(time.time())) + " 星期" + str(day) def savedesc(desc): with open('name_tiwen.txt', 'a', encoding='utf-8') as f: f.write(gettime() + "\n" + desc+"\n")# 啟動tkinter主程序 root.mainloop()
