成果展示:


一、准备工作

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

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐