python gui编程实例_pythonGUI项目-点名小程序

一、概况

文章主要用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组件,是表示中奖名单

图片展示:

20200615230603189668.png

五、日志实现

日志主要为了记录提问的人、什么时候提问的,然后把这些信息写入到本地。

实现函数如下:

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

记录效果如下:

20200615230603373269.png

六、其他

以上就是我这个程序的基本功能,另外我还添加了程序的背景图的函数代码

image2 =Image.open(r‘C:\Users\86152\Pictures\b.jpg‘)

background_image=ImageTk.PhotoImage(image2)

background_label= tkinter.Label(root,image=background_image)

效果图如下:

20200615230603465069.png

完整代码如下:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值