pycharm随机点名(包含姓名、学号和图)

**特点:**包含姓名、学号和图对应滚动,随机点名
代码如下:

'''
*****************************
利用窗体随机点名
包含图的滚动
*****************************
'''

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)图形部分总是在相同位置后面的图形遮挡前面的,而并不是后面的替换前面的,该如何解决?

希望各位对代码进行改进,并@我分享,谢谢

你可能感兴趣的:(软件类)