pythonGUI项目-点名小程序,,一、概况文章主要用P


一、概况

文章主要用Python程序写一个课堂抽奖式点名器,用到的是Python中的GUI编程,思路是使用tkinter编写界面,使用3个Label组件和多线程技术实现学生名单的滚动显示。

我们大概做的功能有二个:

(1)随机点名

(2)日志记录

二、页面搭建

首先我们先简单的把界面搭建出来,代码如下:

import tkinter as tkroot = 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 tkinterimport tkinter.messageboximport randomimport threadingimport itertoolsimport timeimport datetimeimport xlrdfrom PIL import Imagefrom PIL import ImageTkroot = 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 = Falsedef 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()

pythonGUI项目-点名小程序

评论关闭