基于python的Tkinter模块和Threading模块制作的用于班级/多人抽签的小程序

程序思路:

先录入需要进行抽签的所有人的名字数据,然后进行随机打乱,显示随机打乱的结果在标签上,通过增加Threading模块控制抽签这个线程的进行与停止。 在本例中,我增加了当抽到之前已经抽到的人时,会提示此人被选过且选过了几次(见代码)


注意事项:

1:

代码中录入数据的部分是基于手动输入名字的少数人的情况,如果人数较多,可通过本文导入的方式进行数据导入。且当人名固定时,可以将这里输入数据部分的代码去掉,改为固定的人名数据,那么每次启动程序时不用都输入数据

2:

更新GUI界面容易陷入的BUG:
即开始容易在实现标签更新这个操作上使用while死循环导致程序无法进入mainloop语句从而使程序卡死了。也就是所谓的GUI堵塞。

解决GUI堵塞办法:

1:增加子线程模块,控制线程的进行(即我代码下的一个简单示例)

2:利用在mainloop前面加上root(主窗口)的after()方法,该方法常有两个参数,参数1是时间,单位是毫秒,参数2是执行的函数,函数名后面不用加括号。(通过在参数2执行的函数中再次加上root.after方法实现一定程度上的刷新界面的效果)


代码如下:(有部分注释)
import tkinter
import tkinter.messagebox
import random  #利用其random.shuffle()对列表进行随机打散
import threading#引入线程模块
import itertools#cylce()生成可迭代的对象利用next()进行对象的遍历
import time

def clickStart():
    #z增加子线程,防止GUI堵塞
    t = threading.Thread(target=shuffleUsers)
    t.start() #启动线程
    btnStart['state'] = 'disabled'#线程启动,启动键变不能按的状态
    btnStop['state'] = 'normal' #线程启动,停止键变为正常按钮状态


def clickStop():
    global times#利用global达到改变全局变量的目的
    root.flag = False  # 暂停线程
    time.sleep(0.1)
    times += 1
    result = showLabel['text']
    #tkinter.messagebox.showinfo(title="抽签结果:", message='第' + str(times) + '位' + ": " + showLabel['text'])
    #增加条件判断,已经抽过了的进行提示
    print(results)
    if(result in results):
        number = results.count(result)
        tkinter.messagebox.showinfo(title="抽签结果:", message=showLabel['text']+"已经选过"+str(number)+'次了!')
    else:
        tkinter.messagebox.showinfo(title="抽签结果:", message='第' + str(times) + '位' + ": " + showLabel['text'])
    results.append(result)


    btnStart['state'] = 'normal' #线程暂停,启动按钮由不能按状态变为正常按钮状态
    btnStop['state'] = 'disabled' #线程暂停,停止按钮由正常按钮变为不能按的状态


def shuffleUsers():  # 开始洗牌线程,将洗牌这个过程作为一个独立的线程进行管理
    root.flag = True
    random.shuffle(humans)
    t = itertools.cycle(humans)
    while root.flag:
        showLabel['text'] = next(t)
        time.sleep(0.1)#延缓速度

#录入数据
human_number = int(input('请输入你需要录入的人数个数:\n'))
humans = [] #存储需要抽奖的全部人
for i in range(human_number):
    human = input('请输入第%d位学生的姓名:'%(i+1))
    humans.append(human)
print('名字录入完成')

#空列表存储每次抽签的结果
results = []

#GUI界面
root = tkinter.Tk()
root.title("抽签APP")
root.geometry("300x300")
root.resizable(False, False)#设置窗口大小不可改变

root.flag = False  # 初始线程状态为False
times = 0

#开始按钮
btnStart = tkinter.Button(root, text='Start', command=clickStart)
btnStart.place(x=30, y=10, width=80, height=20)
#停止按钮
btnStop = tkinter.Button(root, text='Stop', command=clickStop)
btnStop['state'] = 'disabled' #初始化停止按钮的状态
btnStop.place(x=200, y=10, width=80, height=20)

showLabel = tkinter.Label(root, text='',font = ('Arial',18))
showLabel['fg'] = 'red' #文字前景色为红色
showLabel.place(x=100, y=180, width=100, height=20)

root.mainloop()
运行效果:


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这就是一个简易的抽签程序,仍有许多不足之处需要改进,仅供记录和参考!!


The End!!创作不易,欢迎点赞/评论!!欢迎关注个人公众号

在这里插入图片描述

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值