前言
今天给大家介绍Python实现课堂随机抽选提问并语音播报学生姓名实战案例,废话不多说直接开整~
开发工具
Python版本: 3.6
相关模块:
tkinter模块
time模块
random模块
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
核心功能设计
总体来说,我们这款课堂点名器实现的思路大致是,可以自定义设置班级学生姓名或者默认通过学号进行学生随机点名抽取,随机抽取到的学生将以语音播报的形式进行展示出来。
拆解需求,接下来我们可以通过以下几步进行实现:
- 排版布局设计
- 读取学生名单,如果不存在文件就使用模拟数据
- 随机打乱学生名单
- 实现对学生姓名的随机点名抽取语音播报功能
- 用来滚动显示学生名单
win32con模块安装
python -m pip install pypiwin32
排版布局设计
根据点名器所需要的功能,首先我们可以进行排版布局设计,我们这次主要使用TKinter模块。主要包含了读取学生名单,如果不存在文件就使用模拟数据、随机打乱学生名单、实现对学生姓名的随机点名抽取语音播报功能、用来滚动显示学生名单等。
核心设计代码
root = tkinter.Tk()
# 窗口标题
root.title('随机提问')
# 窗口初始大小和位置
root.geometry('260x180+400+300')
# 不允许改变窗口大小
root.resizable(False, False)
# 关闭程序时执行的函数代码,停止滚动显示学生名单
def closeWindow():
if rolling.get():
showinfo('不能关闭', '请先停止名单滚动')
return
root.destroy()
root.protocol('WM_DELETE_WINDOW', closeWindow)
# 读取学生名单,如果不存在文件就使用模拟数据
try:
with open('学生名单.txt', encoding='utf8') as fp:
students = fp.read().splitlines()
except:
showinfo('学生名单不存在',
'当前目录中没有文件:学生名单.txt\n临时使用模拟数据')
students = ['周楚暮', '金夜羽', '乐天晟', '端圣夜', '司翊旋', '上官冽']
# 变量,用来控制是否滚动显示学生名单
rolling = tkinter.BooleanVar(root, value=False)
def switch():
rolling.set(True)
# 随机打乱学生名单
t = students[:]
shuffle(t)
t = cycle(t)
while rolling.get():
# 滚动显示
lbFirst['text'] = lbSecond['text']
lbSecond['text'] = lbThird['text']
lbThird['text'] = next(t)
# 数字可以修改,控制滚动速度
sleep(0.1)
def btnStartClick():
# 每次单击“开始”按钮启动新线程
Thread(target=switch).start()
btnStart['state'] = 'disabled'
btnStop['state'] = 'normal'
btnStart = tkinter.Button(root,
text='开始',
command=btnStartClick)
btnStart.place(x=30, y=10, width=80, height=20)
saying = tkinter.BooleanVar(root, value=False)
def say_name():
while has_speech and saying.get():
say(f"请{lbSecond['text'].replace(',','')}回答问题")
def btnStopClick():
# 单击“停”按钮结束滚动显示
rolling.set(False)
sleep(0.3)
saying.set(True)
Thread(target=say_name).start()
showinfo('恭喜', '本次中奖:'+lbSecond['text'])
saying.set(False)
btnStart['state'] = 'normal'
btnStop['state'] = 'disabled'
btnStop = tkinter.Button(root, text='停', command=btnStopClick)
btnStop['state'] = 'disabled'
btnStop.place(x=150, y=10, width=80, height=20)
# 用来滚动显示学生名单的3个Label组件
# 可以根据需要进行添加,但要修改上面的线程函数代码
lbFirst = tkinter.Label(root, text='')
lbFirst.place(x=80, y=60, width=100, height=20)
运行结果
最后本篇介绍了主要使用 PyQt5
模块来请求数据,使用起来也是非常简单感兴趣的可以自己尝试一下。本篇源码已上传至公众号。
黑客Roman,公众号:Python工程狮。
👍🏻:觉得有收获请点个赞鼓励一下!
🌟:收藏文章,方便回看哦!
💬:评论交流,互相进步!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。