一、概况
文章主要用Python程序写一个课堂抽奖式点名器,用到的是Python中的GUI编程,思路是使用tkinter编写界面,使用3个Label组件和多线程技术实现学生名单的滚动显示。
我们大概做的功能有二个:
(1)随机点名
(2)日志记录
二、页面搭建
首先我们先简单的把界面搭建出来,代码如下:
importtkinter as tk
root=tkinter.Tk()#窗口标题
root.title(‘随机提问‘)#窗口初始大小和位置
root.geometry(‘520x360+250+200‘)
# 不允许改变窗口大小
root.resizable(False, False)defcloseWindow():#关闭程序时执行的函数代码,停止滚动显示学生名单
deftake():
从数据库中读取学生名单函数defswitch():#滚动显示函数
defbtnStartClick():#每次单击“开始”按钮启动新线程函数
defbtnStopClick():#单击“停”按钮结束滚动显示函数
root.mainloop()#启动tkinter主程序
三、数据获取
在班级我们一般都会有个班级人员名单(xxx.xlsx)。当我们初始化程序的时候,我们把本地的数据读取到程序中。
通过xlrd模块可以把数据读取到程序中,但是我们需要安装这个模块:
pip install xlrd
代码如下:
deftake():
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 inrange(nrows):
students.append(sheet0.cell_value(i,1))#变量,用来控制是否滚动显示学生名单
root.flag = False
四、点名实现
defbtnStartClick():#每次单击“开始”按钮启动新线程
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)defbtnStopClick():#单击“停”按钮结束滚动显示
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组件,是表示中奖名单
图片展示:
五、日志实现
日志主要为了记录提问的人、什么时候提问的,然后把这些信息写入到本地。
实现函数如下:
defgettime():
d=datetime.datetime.now()
day= d.weekday() + 1
return time.strftime(‘%Y-%m-%d‘, time.localtime(time.time())) + "星期" +str(day)defsavedesc(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)
效果图如下:
完整代码如下:
importtkinterimporttkinter.messageboximportrandomimportthreadingimportitertoolsimporttimeimportdatetimeimportxlrdfrom PIL importImagefrom PIL importImageTk
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)#关闭程序时执行的函数代码,停止滚动显示学生名单
defcloseWindow():
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 inrange(nrows):
students.append(sheet0.cell_value(i,1))#变量,用来控制是否滚动显示学生名单
root.flag =Falsedefswitch():
root.flag=True#随机打乱学生名单
t =students[:]
random.shuffle(t)
t=itertools.cycle(t)whileroot.flag:#滚动显示
lbFirst[‘text‘] = lbSecond[‘text‘]
lbSecond[‘text‘] = lbThird[‘text‘]
lbThird[‘text‘] =next(t)#数字可以修改,控制滚动速度
time.sleep(0.05)defbtnStartClick():#每次单击“开始”按钮启动新线程
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)defbtnStopClick():#单击“停”按钮结束滚动显示
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)defgettime():
d=datetime.datetime.now()
day= d.weekday() + 1
return time.strftime(‘%Y-%m-%d‘, time.localtime(time.time())) + "星期" +str(day)defsavedesc(desc):
with open(‘name_tiwen.txt‘, ‘a‘, encoding=‘utf-8‘) as f:
f.write(gettime()+ "\n" + desc+"\n")#启动tkinter主程序
root.mainloop()
原文地址:https://www.cnblogs.com/ruanmh/p/13138228.html