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()