pythonGUI項目-點名小程序


一、概況

文章主要用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()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM