先看運(yùn)行結(jié)果
前言
今天給大家介紹Python實(shí)現(xiàn)課堂隨機(jī)抽選提問并語音播報(bào)學(xué)生姓名實(shí)戰(zhàn)案例,廢話不多說直接開整~
開發(fā)工具
Python版本: 3.8
相關(guān)模塊:
tkinter模塊
time模塊
random模塊
環(huán)境搭建
安裝Python并添加到環(huán)境變量鳍咱,pip安裝需要的相關(guān)模塊即可降盹。
核心功能設(shè)計(jì)
總體來說,我們這款課堂點(diǎn)名器實(shí)現(xiàn)的思路大致是谤辜,可以自定義設(shè)置班級(jí)學(xué)生姓名或者默認(rèn)通過學(xué)號(hào)進(jìn)行學(xué)生隨機(jī)點(diǎn)名抽取蓄坏,隨機(jī)抽取到的學(xué)生將以語音播報(bào)的形式進(jìn)行展示出來。
拆解需求丑念,接下來我們可以通過以下幾步進(jìn)行實(shí)現(xiàn):
- 排版布局設(shè)計(jì)
- 讀取學(xué)生名單涡戳,如果不存在文件就使用模擬數(shù)據(jù)
- 隨機(jī)打亂學(xué)生名單
- 實(shí)現(xiàn)對(duì)學(xué)生姓名的隨機(jī)點(diǎn)名抽取語音播報(bào)功能
- 用來滾動(dòng)顯示學(xué)生名單
win32con模塊安裝
python -m pip install pypiwin32
排版布局設(shè)計(jì)
根據(jù)點(diǎn)名器所需要的功能,首先我們可以進(jìn)行排版布局設(shè)計(jì)脯倚,我們這次主要使用TKinter模塊渔彰。主要包含了讀取學(xué)生名單嵌屎,如果不存在文件就使用模擬數(shù)據(jù)、隨機(jī)打亂學(xué)生名單恍涂、實(shí)現(xiàn)對(duì)學(xué)生姓名的隨機(jī)點(diǎn)名抽取語音播報(bào)功能宝惰、用來滾動(dòng)顯示學(xué)生名單等。
核心設(shè)計(jì)代碼
root = tkinter.Tk()
# 窗口標(biāo)題
root.title('隨機(jī)提問')
# 窗口初始大小和位置
root.geometry('260x180+400+300')
# 不允許改變窗口大小
root.resizable(False, False)
# 關(guān)閉程序時(shí)執(zhí)行的函數(shù)代碼再沧,停止?jié)L動(dòng)顯示學(xué)生名單
def closeWindow():
if rolling.get():
showinfo('不能關(guān)閉', '請(qǐng)先停止名單滾動(dòng)')
return
root.destroy()
root.protocol('WM_DELETE_WINDOW', closeWindow)
# 讀取學(xué)生名單尼夺,如果不存在文件就使用模擬數(shù)據(jù)
try:
with open('學(xué)生名單.txt', encoding='utf8') as fp:
students = fp.read().splitlines()
except:
showinfo('學(xué)生名單不存在',
'當(dāng)前目錄中沒有文件:學(xué)生名單.txt\n臨時(shí)使用模擬數(shù)據(jù)')
students = ['周楚暮', '金夜羽', '樂天晟', '端圣夜', '司翊旋', '上官冽']
# 變量,用來控制是否滾動(dòng)顯示學(xué)生名單
rolling = tkinter.BooleanVar(root, value=False)
def switch():
rolling.set(True)
# 隨機(jī)打亂學(xué)生名單
t = students[:]
shuffle(t)
t = cycle(t)
while rolling.get():
# 滾動(dòng)顯示
lbFirst['text'] = lbSecond['text']
lbSecond['text'] = lbThird['text']
lbThird['text'] = next(t)
# 數(shù)字可以修改炒瘸,控制滾動(dòng)速度
sleep(0.1)
def btnStartClick():
# 每次單擊“開始”按鈕啟動(dòng)新線程
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"請(qǐng){lbSecond['text'].replace(',','')}回答問題")
def btnStopClick():
# 單擊“陀俣拢”按鈕結(jié)束滾動(dòng)顯示
rolling.set(False)
sleep(0.3)
saying.set(True)
Thread(target=say_name).start()
showinfo('恭喜', '本次中獎(jiǎng):'+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)
# 用來滾動(dòng)顯示學(xué)生名單的3個(gè)Label組件
# 可以根據(jù)需要進(jìn)行添加,但要修改上面的線程函數(shù)代碼
lbFirst = tkinter.Label(root, text='')
lbFirst.place(x=80, y=60, width=100, height=20)
最后
今天的分享到這里就結(jié)束了 顷扩,感興趣的朋友也可以去試試哈
對(duì)文章有問題的拐邪,或者有其他關(guān)于python的問題,可以在評(píng)論區(qū)留言或者私信我哦
覺得我分享的文章不錯(cuò)的話隘截,可以關(guān)注一下我扎阶,或者給文章點(diǎn)贊(/≧▽≦)/