**特点:**包含姓名、学号和图对应滚动,随机点名
代码如下:
'''
*****************************
利用窗体随机点名
包含图的滚动
*****************************
'''
from tkinter import * #窗体
import tkinter as tk
import time #时间
from PIL import Image,ImageTk #图
import os
import glob #文件中调图用
class RandomName(Frame):
def __init__(self, parent=None, **kw): #定义类中属性,_init_为python固定用法
Frame.__init__(self, parent, kw)
self.name_list = [] #存放姓名
self.num_list=[] #存放学号
self.pic_list=[] #存放图
self._start = 0.0
self._elapsedtime = 0.0
self._running = False #是否正在运行
self.timestr = StringVar() #姓名临时变量
self.timestr2=StringVar() #学号临时变量
self.timestr3=StringVar() #图
self.makeWidgets() #定义标签栏
def makeWidgets(self): #调用set_name函数方法
#self.timestr = '姓名'
labName = Label(self, textvariable=self.timestr, font=("Arial, 35")) #令标签临时变量为self.timestr,改变其赋值就可改变文本显示
self.set_name(self._elapsedtime) #调用set_name函数方法
labName.pack()
#self.timestr2 = '学号'
labNum = Label(self, textvariable=self.timestr2, font=("Arial, 35"))
#self.set_name(self._elapsedtime) #调用set_name函数方法
labNum.pack()
def set_name(self, elap): #elap为一个时间参数
# 随机产生姓名
cur = int(elap * 100 % 30) #列表中序号
name_list = ['生安', '李鑫灏', '薛佛世', '蔡壮保', '钱勤堃', '潘恩依', '陈国柏', '魏皑虎',
'周卓浩', '汤辟邦', '张顺谷', '张悌斯', '张灶冲', '易江维', '孙来笙', '饶展林',
'岳列洋', '时党舒', '周迟蒲', '廉梦容', '张淮森', '夏劲釜', '好隐', '刘昼星',
'池弈', '邹包幼', '施峪', '武慎萌', '范千皋', '潘佩焱']
num_list = ['1', '2', '3', '4', '5', '6', '7', '8',
'11', '22', '33', '44', '55', '66', '77', '88',
'111', '222', '333', '444', '555', '666', '777', '888',
'1111', '2222', '3333', '4444', '5555', '6666']
image_dir = r"F:\PythonFiles\PycharmFile\picture"
file_glob = os.path.join(image_dir, "*." + "png") #图的数量要和姓名数量一样
self.pic_list.extend(glob.glob(file_glob))
self.timestr.set(name_list[cur]) #给姓名标签赋值
self.timestr2.set(num_list[cur]) #给学号标签赋值
#self.timestr3.set(self.pic_list[cur])
self.pic_label(self.pic_list[cur])
# 更新显示内容
def update(self):
self._elapsedtime = time.time() - self._start
self.set_name(self._elapsedtime) # 设置显示内容
self._timer = self.after(50, self.update) # 刷新界面
# 开始按钮
def Start(self):
if self._running==False: #初始为默认为false
self._start = time.time() - self._elapsedtime
self.update()
self._running = True
# 暂停按钮
def Stop(self):
if self._running==True:
self.after_cancel(self._timer)
self._elapsedtime = time.time() - self._start
self.set_name(self._elapsedtime)
self._running = False
# 显示窗口
def name_label(self):
btnStart=Button(self, text='start', command=self.Start, width=10, height=2)
btnStart.pack()
btnEnd=Button(self, text='stop', command=self.Stop, width=10, height=2)
btnEnd.pack()
self.pack()
# 定义图标签位
def pic_label(self,path):
img =path # 路径
photo = Image.open(img) #利用Image模块打开图
w,h=photo.size #原始尺寸
resizePhoto= self.pic_resize(w,h,153,153,photo) #Image模块下利用自己的方法进行尺寸缩放
tkPhoto=ImageTk.PhotoImage(resizePhoto) #把Image图改为tkinter类型图
labelImg = tk.Label(self, image=tkPhoto)
labelImg.pack()
labelImg.config(image=tkPhoto) #以下两句代码非常重要,是保证图在函数中可以被加载的途径
labelImg.image = tkPhoto
labelImg.pack()
labelImg.place(x=50, y=100)
#缩放图的尺寸
def pic_resize(self,w, h, w_box, h_box, pil_image): #参数分别为:w和h为原始尺寸,w_bow和h_box为希望尺寸,pil_image为原图
f1 = 1.0 * w_box / w # 1.0 forces float division in Python2
f2 = 1.0 * h_box / h
factor = min([f1, f2])
width = int(w * factor)
height = int(h * factor)
return pil_image.resize((width, height), Image.ANTIALIAS)
if __name__ == '__main__': #这句代码意思是该文件被直接运行时才会运行以下代码;要是作为模块被其他文件引用时,不运行以下代码
root = Tk() #定义一个tkinter类root; Tkinter为图形界面库
root.title("随机点名") #标题
root.geometry('450x450') #窗体尺寸
root.geometry('+400+100') #窗体距离屏幕边缘尺寸
sw = RandomName(root) #一个实例,调用自定义的RandomName类,把窗体root实例传到类中
sw.name_label()
#sw.pic_label(r'F:\PythonFiles\PycharmFile\picture\exc30.png')
root.mainloop() #使窗口保持
未解决问题:
1)按钮总是遮挡图,如何进行tkinter中的布局?
2)图形部分总是在相同位置后面的图形遮挡前面的,而并不是后面的替换前面的,该如何解决?
希望各位对代码进行改进,并@我分享,谢谢