Python系列 | 基于Tkinter图形化界面实现课堂点名系统

课堂点名器实现的效果:

请添加图片描述

exe程序已打包如下,欢迎大家下载使用!!!

链接:课堂点名系统 提取码: qx18

一、核心功能设计

课堂点名系统实现的思路大致为可以自定义设置班级学生姓名或者默认通过学号进行学生随机点名抽取(txt文件),可以随机点名和顺序点名两个模式互相切换,并将这些随机抽取的学生姓名历史数据显示。

拆解需求,接下来我们可以通过以下几步进行实现:

  1. UI排版布局设计,确认点名器的各个功能设计
  2. 读取班级学生的姓名文件,将各个学生的姓名加载到列表中
  3. 实现对学生姓名的随机点名抽取功能和顺序点名抽取功能
  4. 语言播报功能
  5. 查看随机抽取的学生姓名历史数据

二、准备工作

1. Tkinter

Tkinter 是 python 内置的 TK GUI 工具集。TK 是 Tcl 语言的原生 GUI 库。作为 python
的图形设计工具,它所使用的 Tcl 语言环境已经完全嵌入到了 python 解释器中。

我们使用Tkinter开发GUI界面。

2. Pyttsx3

pyttsx3是Python中的文本到语音转换库。

我们使用Pyttsx3开发语音播报。

三、实现步骤

1. UI排版布局设计实现

根据点名器所需要的功能,首先我们可以进行UI布局设计,使用的是Tkinter。主要包含了姓名的随机抽取显示功能、开始与结束执行按钮、抽取历史结果的查看功能、姓名文件的读取显示等。

核心设计代码如下:

# woshinsy
# 主界面
name_list = []
history_list=[]
running_flag=False
seed=False
author=False
root = Tk()
root.title('Python_点名器 V2.0')
root.iconbitmap('favicon.ico')
root.geometry('500x360')
root.call("source", "azure.tcl")
root.call("set_theme", "dark")
a = StringVar()
a.set('恭喜谁呢?')
b = StringVar()
b.set('顺序模式')

# 扩展UI
root.paned = ttk.PanedWindow(root,height='250',width='500')
root.paned.grid(row=0, column=2, pady=(400, 5), rowspan=50)
# Notebook, pane #2
root.pane_2 = ttk.Frame(root.paned, padding=5)
root.paned.add(root.pane_2, weight=3)
# Notebook, pane #2
root.notebook = ttk.Notebook(root.pane_2)
root.notebook.pack(fill="both", expand=True)
root.tab_2 = ttk.Frame(root.notebook)
root.notebook.add(root.tab_2, text="历史点名:")

Label1 = Label(root,textvariable=a,font=('黑体', 60,'bold'),bd=0,bg=root['bg'],activebackground=root['bg']).place(y=50,x=65)
Start_Button = ttk.Button(root,style="Accent.TButton",text='开始',command=lambda :thread_it(start_point)).place(x=50,y=200)
End_Button = ttk.Button(root,text='结束',command=stop_point).place(x=200,y=200)
Load_Button = ttk.Button(root,text='加载文件',command=load_names)
Load_Button.place(x=50,y=300)
Mode_Button = ttk.Checkbutton(root,style="Toggle.TButton",textvariable=b,command=switch_mode).place(x=200,y=300)
name_num = Label(root,font=('Arial', 20),foreground = '#FF7F50',bd=0,bg=root['bg'],activebackground=root['bg'])
name_num.place(x=130,y=150)
Show_Button = ttk.Button(root,text='查看历史点名',command=history_point).place(x=350,y=200)
name_history = ttk.Label(root)
name_history.place(x=20,y=435)
About_Button = ttk.Button(root,text='关于作者',command=about_author).place(x=355,y=300)
aboutme = Label(root,text="欢迎使用点名系统v2.0\n作者:woshinsy\n姓名:农思毅",font=('黑体',20,'bold'),bd=0,bg=root['bg'],activebackground=root['bg']).place(y=50,x=500)
root.mainloop()

UI实现效果:

请添加图片描述

2. 学生姓名名单加载实现

接下来我们需要对要随机点名抽取的学生姓名进行加载放到一个列表中,这里我们需要注意的是可以自己手动选择人名单,前提是人名单格式为txt,且每个名字占一行。

核心设计代码如下:

# woshinsy
def load_names():
    filename = askopenfilename(filetypes = [('文本文件', '.TXT'), ],title = "选择名单文件",initialdir="./")
    if filename:
        with open(filename, "r", encoding='utf-8') as f:  #打开文本
            # data = f.read()   #读取文本
            # print(data)
            for line in f.readlines():
                line = line.strip('\n')  # 去掉列表中每一个元素的换行符
                name_list.append(line)
        name_num.config(text="一共加载了"+str(len(name_list))+"个姓名")
    else:
        messagebox.showwarning("警告","导入失败,请检查错误!")
    return name_list

3. 多线程实现

首先定义多线程函数,使用多线程可防止线程阻塞。

核心代码如下:

# woshinsy
def thread_it(func, *args):
    t = threading.Thread(target=func, args=args)
    t.setDaemon(True) #thread.setDaemon()设置为True, 则主线程执行完毕后会将子线程回收掉,设置为false,主进程执行结束时不会回收子线程
    t.start()

4. 模式切换实现

我们已经在设计主界面的时候设置了默认的模式为顺序模式,开始点名前我们需要判断点名模式,通过if语句给b赋值判断模式。

核心代码如下:

def switch_mode():
    if b.get() == '顺序模式':
        b.set('随机模式')
    elif b.get() == "随机模式":
        b.set('顺序模式')

5. 随机点名和顺序点名与语言播报结束点名实现

随机点名我们可以设计两个按钮(开始与结束按钮),分别来控制开始抽取和停止抽取功能,首先通过flag来确定用户点击的是随机模式还是顺序模式,然后通过random和choice来进行学生姓名列表数据的随机抽取,从而实现随机点名的功能,通过循环来进行学生姓名列表的顺序点名。

核心代码如下:

# woshinsy
def start_point():
    global running_flag
    if len(name_list)==1:
        messagebox.showinfo("提示", '人名单就一个人,不用选了!')
        a.set('恭喜'+ name_list[0])
        return
    elif len(name_list)!=0:
        Load_Button.config(state=DISABLED)
        running_flag = True
        if b.get() == '顺序模式':
            mode = "sequence"
        elif b.get() == '随机模式':
            mode = "random"
        else:
            pass
        thread_it(point_name_begin(mode))
    else:
        messagebox.showwarning("警告", "请先导入人名单!")

def point_name_begin(mode):
    global running_flag
    if mode == "sequence":
        if running_flag:
            always_ergodic()
    elif mode == "random":
        while True:
            if running_flag:
                random_choice_name = random.choice(name_list)
                a.set('恭喜' + random_choice_name)
                time.sleep(0.05)
            else:
                break

def always_ergodic():
    for i in name_list:
        if running_flag:
            a.set('恭喜'+ i)
            time.sleep(0.05)
            if i==name_list[-1]:
                always_ergodic()
        else:
            break

def stop_point():
    global running_flag
    history_list.append(a.get())
    name_history.config(text=history_list)
    if running_flag:
        running_flag = False
        Load_Button.config(state=NORMAL)
        time.sleep(1)
        pyttsx3.speak(a.get())
    else:
        messagebox.showwarning("警告", "请先导入人名单!")

6. 抽取历史查看实现

对点名的学生姓名进行历史数据显示查看功能。该功能实现也很简单,对seed进行判断展开界面,需要先定义一个空列表,然后将取得的学生姓名加载到新的空列表即可实现。

核心代码如下:

# woshinsy
# name_history.config(text=history_list)
def history_point():
    global seed
    if not seed:
        root.geometry('500x656')
        seed = True
    else:
        root.geometry('500x360')
        seed = False

7.关于作者实现

对变量author进行判断展示窗口,我是直接将内容写入了Label标签里。

核心代码如下:

# woshinsy
# aboutme = Label(root,text="欢迎使用点名系统v2.0\n作者:woshinsy\n姓名:ny",font=('黑体',20,'bold'),bd=0,bg=root['bg'],activebackground=root['bg']).place(y=50,x=500)
def about_author():
    global author
    if not author:
        root.geometry('810x360')
        author = True
    else:
        root.geometry('500x360')
        author = False

四、打包配置

Python常用的打包工具是第三方库Pyinstaller,需要安装下pyinstaller。

pip install Pyinstaller

接下来,我们需要打开命令窗口,切换到项目目录下再执行打包命令。

pyinstaller -F -i ./img.ico 点名.py

打包常用的参数如下:

-F 表示生成单个可执行文件
-p 表示你自己自定义需要加载的类路径
-i 表示可执行文件的图标
-w 表示去掉控制台窗口

  • 6
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
图书馆管理系统是一种用于管理图书馆资源、用户信息以及借阅归还等流程的管理系统。在现代图书馆的日常管理中,它已经成为了不可或缺的一部分。本系统采用python语言编写,使用mysql数据库存储数据,并采用tkinter图形化界面展示,便于用户交互操作。 该系统主要分为三个模块,分别是图书管理模块、用户管理模块和借还管理模块。在图书管理模块中,管理员可以添加、删除和修改图书信息,并查询图书的详细信息。在用户管理模块中,管理员可以添加、删除和修改用户信息,并查询用户的详细信息。在借还管理模块中,管理员可以进行图书借阅、归还等操作,并查询借阅记录和归还记录。 系统采用mysql数据库来存储数据,包括图书信息、用户信息、借阅记录、归还记录等,以保证数据的安全和稳定性。在编写源码时,注重代码的规范性和可读性,添加了详细的注释,方便后续开发和维护。同时,系统界面采用tkinter图形化工具包,界面设计简洁而美观,操作简单方便。 总之,该图书馆管理系统采用python语言编写,使用mysql数据库存储数据,并采用tkinter图形化界面展示,主要包括图书管理模块、用户管理模块和借还管理模块,注重代码的规范性和可读性,界面简洁美观,操作方便。它为图书馆管理提供了一种高效、便捷的解决方案,能够满足不同图书馆的具体需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值