#實作名單輪播、點名、語音播報功能
#優化版本1
# -*- coding:utf8 -*- #
# -----------------------------------------------------------------------------------
# ProjectName: python3
# FileName: name
# Author: shuxiaying
# Date: 2020/7/9
# Description:
# -----------------------------------------------------------------------------------
import datetime
import os
import random
import tkinter as tk
try:
import pyttsx3
except:
os.system('configuration.bat') # 更新pip,安裝pyttsx3(configuration.bat檔案未上傳
)
try:
import pyttsx3
except:
os.system('echo Something error, please check the proxy.')
finally:
pass
finally:
pass
from call_name.config import CallNameDriver(詳情見:https://www.cnblogs.com/ttj57/p/13576078.html)
class ForGUI:
def __init__(self):
# 引入pyttsx3庫,實作語音播報
try:
self.eng = pyttsx3.init()
except:
os.system('echo can not start the function of speech.')
finally:
pass
try:
self.cname = CallNameDriver()
except:
msg["text"] = "未找到花名冊"
msg.update()
else:
try:
record = self.cname.read_record() # 讀取記錄
except:
self.cname.mk_record() # 讀取例外則重新創建記錄
record = self.cname.read_record()
self.re_date = record["date"] # 獲取使用日期記錄
# 每5天初始化一次記錄
if len(self.re_date) > 5:
self.cname.mk_record() # 重新創建記錄
else:
# 判斷花名冊是否有修改
keys_list = self.cname.get_keys()
try:
assert keys_list == self.cname.namelist
except:
keys = set(keys_list)
names = set(self.cname.namelist)
new_add = names - keys # 獲取新增
new_del = keys - names # 獲取移除
if new_add:
self.cname.re_mod(new_add=new_add)
if new_del:
self.cname.re_mod(new_del=new_del)
# 開始點名,輸出有效姓名:姓名對應記錄不為最大次數
def start(self):
bt["state"] = 'disable' # 禁止重復點擊
times = self.cname.re_times() # 獲取記錄次數
max_times = max(times) # 獲取記錄最大次數
min_times = min(times) # 獲取記錄最小次數
td = str(datetime.datetime.today().date()) # 獲取當前日期
if not td in self.re_date:
self.cname.re_mod(re_date=td)
while True:
name = self.cname.call_name() # 產生隨機姓名
times = self.cname.call_times(name) # 獲取被點到成員記錄次數
if max_times != min_times:
if times != max_times:
self.cname.re_mod(name=name) # 修改記錄
msg["text"] = name
msg.update()
try:
if sp_bt["text"] == "語音播報開":
self.eng.say(name)
self.eng.runAndWait()
self.eng.stop()
except:
pass
break
else:
self.cname.re_mod(name=name) # 修改記錄
msg["text"] = name
try:
if sp_bt["text"] == "語音播報開":
self.eng.say(name)
self.eng.runAndWait()
self.eng.stop()
except:
pass
break
bt["state"] = 'normal' # 恢復點擊
# 查看花名冊
def open_name_excel(self):
try:
os.system("start %s&exit" % self.cname.excel_file_path)
except:
msg["text"] = '\n未找到花名冊╮(╯▽╰)╭\n'
msg["font"] = ('', 18)
msg.update()
# 查看點名記錄
def open_record(self):
try:
os.system("start %s&exit" % self.cname.file_path)
except:
msg["text"] = '\n未找到點名記錄╮(╯▽╰)╭\n'
msg["font"] = ('', 18)
msg.update()
def sp_unchecked(self):
sp_bt["command"] = self.sp_checked
sp_bt["text"] = "語音播報關"
sp_bt.update()
def sp_checked(self):
sp_bt["command"] = self.sp_unchecked
sp_bt["text"] = "語音播報開"
sp_bt.update()
# 隨機顯示花名冊名單
def info(self):
name_list = self.cname.namelist
name = random.choice(name_list)
msg["font"] = ('', 44)
msg["text"] = (name)
msg.update()
def bt_listen(self):
while bt["state"] == 'normal':
bt['text'] = "就決定是你了"
bt['command'] = self.bt_start
bt.update()
root.after(500, func=self.info)
continue
def bt_start(self):
bt['command'] = self.bt_listen
bt['text'] = "開始"
bt.update()
fg = ForGUI()
root.after(500, fg.start)
if __name__ == '__main__':
# 創建視窗
root = tk.Tk(className="點名工具")
# 設定視窗大小
setWidth = 300
setHeight = 200
# 獲取螢屏解析度
screenWidth = root.winfo_screenwidth()
screenHeight = root.winfo_screenheight()
x = int((screenWidth - setWidth) / 2)
y = int((screenHeight - setHeight) / 2)
# 設定視窗初始位置螢屏居中
root.geometry("%sx%s+%s+%s" % (setWidth, setHeight, x, y))
# 設定視窗寬高固定
root.resizable(0, 0)
# 創建選單欄
m1 = tk.Menu(root, tearoff=False)
# 創建子選單,不顯示分窗
MenuBar = tk.Menu(m1, tearoff=False)
MenuBar.add_command(label='查看名單', command=ForGUI().open_name_excel)
MenuBar.add_command(label='查看記錄', command=ForGUI().open_record)
MenuBar.add_command(label='清空記錄', command=CallNameDriver().mk_record)
# 將子選單加入選單欄中
m1.add_cascade(label='選項', menu=MenuBar)
m1.add_command(label='Exit', command=root.quit)
# 將選單欄添加到視窗
root.config(menu=m1)
f_sp = tk.Frame(root, width=300)
f_sp.pack(pady=2)
# 創建語音播報開關
sp_bt = tk.Checkbutton(f_sp, text="語音播報關", font=('', 10), justify="right", command=ForGUI().sp_checked)
sp_bt.pack()
f1 = tk.Frame(root, bd=1, height=150, width=300)
f1.pack(pady=6)
# 創建文本顯示
msg = tk.Label(f1, text="\n別緊張(●ˇ?ˇ●)\n",font=('', 18), fg="green") # 創建文本控制元件
msg.pack(pady=8)
f2 = tk.Frame(root)
f2.pack()
# 創建開始按鈕
bt = tk.Button(f2, text='開始點名嘍', stat="normal", command=ForGUI().bt_listen, bd=4, width=20, font=18)
bt.pack(pady=6)
root.mainloop()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/13987.html
標籤:Python
下一篇:python基礎2
