pythonGUI项目-点名小程序

Posted 阮满欢

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()

 

以上是关于pythonGUI项目-点名小程序的主要内容,如果未能解决你的问题,请参考以下文章

随机点名小程序--- -JAVA版本

Python GUI编程

python制作的点名神器(代码简单,适合初学者),老师再也不用发愁点名了

小案例之随机点名系统

项目实战基于Pthon+PyQt5的GUI点名程序(附完整源码)

微信小程序代码片段分享