基于python实现的随机点名
随机点名python
成果展示:

一、准备工作
1.安装pycharm并配置解释器
具体从b站上搜索
2.导入需要的软件包
import random
import pandas as pd
from tkinter import *
import threading
3.思路
(1)初始化
(2)创建线程
(3)主程序
(4)执行脚本
二、初始化界面
(1) 初始化类
def __init__(self):
self.user_list = pd.read_excel('./学生表.xlsx').姓名.tolist()
self.windows = Tk()
self.start = True
self.stop = True
self.index = ''
self.label_var = StringVar(value='XXXXX')
self.button_var = StringVar(value=f'开始')
1.导入excel表格
![]()
-
使用pandas库,导入excel表格中的姓名列
2.创建一个窗口
-
使用tkinter库,将窗口赋值给self.windows
3.初始化初始状态和结束状态
-
将初始状态和结束状态设置为True
4.初始化一个空字符实例变量
-
以便后续使用
5.初始化标签和按钮
-
创建2个StringVar对象,赋值给self.label_var和self.button_var
-
StringVar用于存储字符串值
-
self.label_var的值为"XXXXX"
-
self.button_var的值为"开始"
如下图:

(2) 使用tkinter库来创建一个图形用户界面
def ui(self):
self.windows.resizable()
self.windows.title('班级点名')
width, height = 480, 455
scree_width = (self.windows.winfo_screenwidth() - width) // 2
scree_height = (self.windows.winfo_screenheight() - height) // 2
self.windows.geometry(f'{width}x{height}+{scree_width}+{scree_height}')
(Label(self.windows, textvariable=self.label_var, font=('微软雅黑', 60), height=4,
background='grey')
.pack(side=TOP, fill='x'))
(Button(self.windows, textvariable=self.button_var, font=('微软雅黑', 20),
command=lambda: self.thread(self.show_name))
.pack(side=TOP, fill='x'))
self.windows.mainloop()
1.允许调整窗口的大小
2.命名标题
-
将窗口的标题命名为班级点名
3.设置窗口的高度和宽度
-
获取窗口的宽度和高度
-
然后计算窗口的宽度和高度使其居中
4.设置标签
-
文本由self.label_var控制,字体设置为“微软雅黑”60号,高度为4行(这里的“高度”属性实际上是指标签可以显示的行数,而不是像素高度),背景色为灰色
-
.pack(side = TOP, fill = 'x')将标签放置在窗口的顶部,并使其水平填充其父容器(在这里是窗口)
5.设置按钮
-
其文本由self.button_var变量控制,字体设置为“微软雅黑”20号
-
当按钮被点击时,它会执行一个lambda函数,该函数调用self.thread(self.show_name)
-
self.thread是一个方法,用于在单独的线程中运行self.show_name,以避免阻塞GUI
-
.pack(side = TOP, fill = 'x')将按钮也放置在窗口的顶部(紧跟在标签之后,因为它们是按照添加顺序堆叠的),并使其水平填充父容器
6.启动tkinter的事件循环
-
使窗口保持打开状态并等待用户交互(如点击按钮)
三、创建线程
使用thread创建一个线程
def thread(self, function):
th = threading.Thread(target=function)
th.daemon = True
th.start()
1.创建线程
-
创建了一个Thread对象,其target参数设置为要在新线程中执行的函数。
2.守护线程
-
将线程设置为守护线程
-
守护线程的特点是,当主程序结束时,无论守护线程是否还在运行,它都会被强制结束
3.启动线程
-
在调用start()之后,线程将开始执行target函数
四、主程序
def show_name(self):
if self.start:
self.button_var.set(f'暂停')
self.start = False
while self.stop:
if len(self.user_list) == 0:
self.user_list = pd.read_excel('./学生表.xlsx').姓名.tolist()
self.index = random.randint(0, len(self.user_list) - 1)
self.label_var.set(self.user_list[self.index])
if not self.stop:
self.stop = True
del self.user_list[self.index]
self.button_var.set(f'开始(剩余{len(self.user_list)})')
else:
self.start = True
self.stop = False
1.初始化检查
-
方法检查self.start 的值
-
如果self.start为True,表示当前是暂停状态或已经在进行中,需要切换到另一种状态
2.暂停
-
如果self.start为True,则将按钮的标签设置为“暂停”,并将self.start设置为False,表示现在进入运行(或继续运行)状态
3.继续
-
进入一个while循环,这个循环会一直运行直到self.stop变为False,这个循环的目的是随机显示学生姓名,直到用户决定停止
-
在循环内部,首先检查self.user_list(存储学生姓名的列表)是否为空。如果为空,则从名为“学生表.xlsx”的Excel文件中读取姓名并更新列表
-
然后,选择一个索引self.index,并通过这个索引从self.user_list中获取一个学生姓名,将其显示在界面上
4.开始
-
如果self.start为Fasle(即当前是停止状态),则将其设置为True,表示准备开始或继续显示学生姓名
-
同时,将self.stop设置为False,确保可以开始新的循环
5.停止
-
当self.stop变为True,则退出循环
-
在退出循环后,将当前显示的学生从self.user_list中删除,以确保不会重复显示
-
更新按钮的标签为“开始(剩余{剩余学生数})”,其中剩余学生数通过len(self.user_list)获取
-
将self.stop设置为False,为下一次运行做准备
五、执行脚本
if __name__ == '__main__':
Demo().ui()
结果如下:

六、源码
import random
import pandas as pd
from tkinter import *
import threading
class Demo:
def __init__(self):
self.user_list = pd.read_excel('./学生表.xlsx').姓名.tolist()
self.windows = Tk()
self.start = True
self.stop = True
self.index = ''
self.label_var = StringVar(value='XXXXX')
self.button_var = StringVar(value=f'开始')
def ui(self):
self.windows.resizable()
self.windows.title('班级点名')
width, height = 480, 455
scree_width = (self.windows.winfo_screenwidth() - width) // 2
scree_height = (self.windows.winfo_screenheight() - height) // 2
self.windows.geometry(f'{width}x{height}+{scree_width}+{scree_height}')
(Label(self.windows, textvariable=self.label_var, font=('微软雅黑', 60), height=4, background='grey')
.pack(side=TOP, fill='x'))
(Button(self.windows, textvariable=self.button_var, font=('微软雅黑', 20), command=lambda: self.thread(self.show_name))
.pack(side=TOP, fill='x'))
self.windows.mainloop()
def thread(self, function):
th = threading.Thread(target=function)
th.daemon = True
th.start()
def show_name(self):
if self.start:
self.button_var.set(f'暂停')
self.start = False
while self.stop:
if len(self.user_list) == 0:
self.user_list = pd.read_excel('./学生表.xlsx').姓名.tolist()
self.index = random.randint(0, len(self.user_list) - 1)
self.label_var.set(self.user_list[self.index])
if not self.stop:
self.stop = True
del self.user_list[self.index]
self.button_var.set(f'开始(剩余{len(self.user_list)})')
else:
self.start = True
self.stop = False
if __name__ == '__main__':
Demo().ui()
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)