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

 

posted @ 2020-06-15 22:17  软锰矿  阅读(2057)  评论(1编辑  收藏  举报