课堂点名器实现的效果:
exe程序已打包如下,欢迎大家下载使用!!!
链接:课堂点名系统 提取码: qx18
一、核心功能设计
课堂点名系统实现的思路大致为可以自定义设置班级学生姓名或者默认通过学号进行学生随机点名抽取(txt文件),可以随机点名和顺序点名两个模式互相切换,并将这些随机抽取的学生姓名历史数据显示。
拆解需求,接下来我们可以通过以下几步进行实现:
- UI排版布局设计,确认点名器的各个功能设计
- 读取班级学生的姓名文件,将各个学生的姓名加载到列表中
- 实现对学生姓名的随机点名抽取功能和顺序点名抽取功能
- 语言播报功能
- 查看随机抽取的学生姓名历史数据
二、准备工作
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 表示去掉控制台窗口