主要知识点:线程Threading,语音播报 pyttsx3 (测试了系统语音包,没找到速度控制,放弃了)
# _*_ coding:utf-8 _*_ # @Time: 2021/10/5 16:48 from PyQt5 import QtWidgets from Training_GUI import Ui_Form # import win32com.client #系统语音包 import pyttsx3 # 语音包 import threading # 线程 import time class MyWindow(QtWidgets.QWidget, Ui_Form): def __init__(self, total_training_time=0.0, total_rest_time=0.0): super(MyWindow, self).__init__() self.setupUi(self) # 初始化训练项目、次数、时间列表 self.training_item = [self.lineEdit_Item_1.text(), self.lineEdit_Item_2.text(), self.lineEdit_Item_3.text(), self.lineEdit_Item_4.text(), self.lineEdit_Item_5.text(), self.lineEdit_Item_6.text(), self.lineEdit_Item_7.text()] self.training_time = [float(self.lineEdit_Training_Time_1.text()), float(self.lineEdit_Training_Time_2.text()), float(self.lineEdit_Training_Time_3.text()), float(self.lineEdit_Training_Time_4.text()), float(self.lineEdit_Training_Time_5.text()), float(self.lineEdit_Training_Time_6.text()), float(self.lineEdit_Training_Time_7.text())] self.training_num = [int(self.lineEdit_Training_Num_1.text()), int(self.lineEdit_Training_Num_2.text()), int(self.lineEdit_Training_Num_3.text()), int(self.lineEdit_Training_Num_4.text()), int(self.lineEdit_Training_Num_5.text()), int(self.lineEdit_Training_Num_6.text()), int(self.lineEdit_Training_Num_7.text())] self.rest_time = [float(self.lineEdit_Rest_Time_1.text()), float(self.lineEdit_Rest_Time_2.text()), float(self.lineEdit_Rest_Time_3.text()), float(self.lineEdit_Rest_Time_4.text()), float(self.lineEdit_Rest_Time_5.text()), float(self.lineEdit_Rest_Time_6.text()), float(self.lineEdit_Rest_Time_7.text())] self.now_training_item = self.next_training_item = self.lineEdit_Item.text() self.now_training_num = self.next_training_num = self.lineEdit_Num.text() self.now_training_time = self.next_training_time = self.lineEdit_TrainingTime.text() self.now_rest_time = self.next_rest_time = self.lineEdit_RestTime.text() self.training_flag = False # 开始训练标识 self.rest_flag = False # 开始休息标识 # 初始化总时间 for index in range(len(self.training_time)): total_training_time += self.training_time[index] * self.training_num[index] total_rest_time += self.rest_time[index] * self.training_num[index] self.lineEdit_Training_Time_Total.setText(str(total_training_time)) self.lineEdit_Rest_Time_Total.setText(str(total_rest_time)) self.engine = pyttsx3.init() # 创建语音对象 rate = self.engine.getProperty('rate') self.engine.setProperty('rate', rate + 50) # 调节语速 self.thread1 = threading.Thread(target=self.training_start) # 创建计时线程1 self.thread2 = threading.Thread(target=self.reading_start) # 创建发音线程2 self.thread1.setDaemon(True) # 设为守护线程,主程序关闭,这本线程自动关闭 self.thread2.setDaemon(True) # 创建信号和槽 self.pushButton_Start.clicked.connect(self.threading1_start) self.pushButton_Pause.clicked.connect(self.training_pause) self.pushButton_Stop.clicked.connect(self.training_stop) # self.lineEdit_Num.textChanged.connect(self.say_num) # self.lineEdit_TrainingTime.textChanged.connect(self.say_time) # self.lineEdit_Item.textChanged.connect(self.say_item) # 设置按钮不可见 self.pushButton_Pause.hide() def threading1_start(self): self.pushButton_Start.setEnabled(False) self.thread1.start() self.thread2.start() def reading_start(self): while True: if self.now_training_item != self.next_training_item: self.next_training_item = self.now_training_item self.engine.say("%s " % self.now_training_item) # self.engine.runAndWait() if self.now_training_num != self.next_training_num: self.next_training_num = self.now_training_num self.engine.say("第 %s 组" % self.now_training_num) # self.engine.runAndWait() if self.training_flag: self.engine.say("开始训练") self.training_flag = False if self.now_training_time != self.next_training_time: self.next_training_time = self.now_training_time self.engine.say(" %s " % self.now_training_time) # self.engine.runAndWait() if self.rest_flag: self.engine.say("开始休息") self.rest_flag = False if self.now_rest_time != self.next_rest_time: self.next_rest_time = self.now_rest_time self.engine.say(" %s " % self.now_rest_time) # self.engine.runAndWait() self.engine.runAndWait() def training_start(self): for item in range(len(self.training_time)): self.lineEdit_Item.setText(self.training_item[item]) self.now_training_item = self.training_item[item] time.sleep(1) for num in range(1, self.training_num[item] + 1, 1): self.lineEdit_Num.setText(str(num)) self.now_training_num = str(num) seconds = int(self.training_time[item] * 60) self.training_flag = True time.sleep(1) for second in range(seconds - 1, -1, -1): self.lineEdit_TrainingTime.setText(str(second)) self.now_training_time = str(second) time.sleep(1) seconds = int(self.rest_time[item] * 60) self.rest_flag = True for second in range(seconds - 1, -1, -1): self.lineEdit_RestTime.setText(str(second)) self.now_rest_time = str(second) time.sleep(1) def training_pause(self): pass def training_stop(self): myShow.close() if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) myShow = MyWindow() myShow.show() sys.exit(app.exec_())