作业要求:输入闹钟设定时间,启动后,到点语音循环播报label上的文字一段时间
绘制界面如下
增加实现功能:
1.显示剩余时间,不仅显示系统时间和闹铃设置时间,也能显示距离闹钟响起的时间
2.输入的时间格式可以兼容中英文的冒号
3.增加输入框,可以自定义语音播报的文字,若为空则播报“懒虫起床”。依旧在原来label显示
4.增加勾选框
勾选默认设置后,点击开始按钮,在不输入信息或输入不规范的信息的情况下,将会调用默认设置的时间进行设置闹钟和语音播报。
如果输入正确信息(只需要闹钟时间即可),将会启动闹钟并将本次设置的时间与播报文字保存到默认设置。如果文本为空,在调用默认设置后,语音播报“懒虫起床”。
不勾选,将启动闹钟。如果文本同样为空,在调用默认设置后,闹钟响铃语音播报“懒虫起床”。
5.
增加重置按钮,与勾选框联动,一键两用。点击的时候,如果不勾选,只清空输入时间和输入播报语音文字的文本框。如果勾选则不仅清空文本框,同时恢复默认时间为最初默认设置
6.语音循环播报功能丐版,每7秒重复一次语音最多5次
实现效果
初始界面
代码
import sys
from PySide6.QtTextToSpeech import QTextToSpeech
from PySide6.QtWidgets import *
from PySide6.QtCore import QTimer, QDateTime,QTime
# from PyQt6.QtGui import QFont
# from PyQt6 import uic
from TimeShow3 import Ui_TimeForm
# 全局变量存储闹钟默认设置
global default_setTime ,default_setMessage
default_setTime= "08:30:00"#默认设置时间
default_setMessage = "懒虫起床!好好学习"#默认设置的语音输出信息
class AlarmClock(Ui_TimeForm,QWidget):
def __init__(self):
super().__init__()
self.setupUi(self)
# 加载UI文件
#=uic.loadUi("./TimeShow3.ui", self)
# 初始化控件
#Label展示当前时间
self.lbl_time: QLabel = self.showtime
#LineEdit文本编辑行,输入设定闹钟时间,
self.txt_setTime: QLineEdit = self.inputtime#要求为HH:mm:ss格式,标点目前兼容中英文
self.txt_setTime.setPlaceholderText("设定闹钟时间,格式如默认08:30:00")
# Label展示当前输入的设定闹钟时间
self.lbl_showSetTime: QLabel = self.showinputtime
# PushButton按钮,清空功能以重新设置时间和语音播报文字
self.btn_reset: QPushButton = self.resbtn
#PushButton按钮 启动/取消闹钟按钮
self.btn_start: QPushButton = self.ssbtn#点击后会改变功能,变为启动或者关闭
# LineEdit文本编辑行,输入语音播报文字,
self.txt_setSound: QLineEdit = self.inputsound # 要求为HH:mm:ss格式标点目前兼容中英文标点
self.txt_setSound.setPlaceholderText("设定提醒文字,默认'懒虫起床!!")
#Label显示输入的提示语音播放文字
self.lbl_message: QLabel = self.showinsound
# Label展示当前输入的设定播报语言文字
self.lbl_showSetSound: QLabel = self.showinsound
# 实力化一个语音播报控件sppeecher
self.speecher = QTextToSpeech()
#CheckBox用于判断是否保存本次设置或者直接使用默认设置
# #在正确输入文字后点击按钮,如果勾选,将会把本次设置设为默认。如果未输入或输入错误信息直接调用默认设置或上次保存设置
self.chk_default: QCheckBox = self.checkBox
# 闹钟使能变量
self.alarm_enable = False#闹钟初始化设置闹钟未启用
#默认信息幅值
self.alarm_time=default_setTime
self.default_setTime=default_setTime
self.default_setMessage=default_setMessage
# 定时器更新系统时间
self.timer1 = QTimer()
self.timer1.timeout.connect(self.update_time)#每一秒更新时间
self.timer1.start(1000) # 1秒更新一次
# self.timer2 = QTimer()
# self.timer2.timeout.connect(self.check_timeout)
# self.timer2.start(5000) # 5秒触发一次
#清空按钮只能在闹钟未设置的下使用
if self.alarm_enable == False:
self.btn_reset.setEnabled(True)
else:
self.btn_reset.setEnabled(False)
# 连接信号
self.btn_start.clicked.connect(self.toggle_alarm)
self.btn_reset.clicked.connect(self.reset_setting)
#self.chk_default.stateChanged.connect(self.load_defaults)
# def check_timeout(self,speech_message):
# current_time = QDateTime.currentDateTime()
# if self.start_time.secsTo(current_time) >= self.timeout:
# self.timer.stop()
# else:
# self.speecher.say(speech_message)
#更新时间函数
def update_time(self): #每秒更新系统时间并检查闹钟是否响应
current_time = QDateTime.currentDateTime()#读取当前时间
# #将读取的时间格式按照指定格式输出
self.lbl_time.setText(f"当前时间:{current_time.toString('yyyy-MM-dd HH:mm:ss')}\n")
if self.alarm_enable and current_time.toString("HH:mm:ss") == self.alarm_time:#到达设定时间闹钟响铃
self.trigger_alarm()#到点响铃
time_str = self.alarm_time
time_input = QTime.fromString(time_str, "HH:mm:ss")
# 计算剩余时间#石山代码,,因为一直报错加上像像改变量,瞎几把已经面目全非
if self.alarm_enable :
current_datetime = QDateTime.currentDateTime()
alarm_datetime = QDateTime(current_datetime.date(), time_input)
# 如果设定时间已过,设置为明天
if alarm_datetime < current_datetime:
alarm_datetime = alarm_datetime.addDays(1)
self.next_alarm = alarm_datetime
if self.alarm_enable and self.next_alarm:
remaining_secs = current_datetime.secsTo(self.next_alarm)
h = remaining_secs // 3600
m = (remaining_secs % 3600) // 60
s = remaining_secs % 60
self.lbl_showSetTime.setText(
f"当前设定闹钟定的时间为: {self.alarm_time}\n"
f"离闹钟响起剩余时间: {h:02}:{m:02}:{s:02}")
#闹钟设置,函数启动/关闭闹钟
def toggle_alarm(self):
#global default_setTime, default_setMessage#默认系统设置,可以储存希望保存的设置,需要勾选checkBox
#情况1,闹钟未启动
if self.alarm_enable == False :
time_str = self.txt_setTime.text().strip().replace(":", ":")#读取输入闹钟信息
sound_str = self.txt_setSound.text()#读取输入语音信息
setTime=QDateTime.fromString(time_str, "HH:mm:ss")#尝试转换输入时间为指定格式
# isValid判断格式是否为指定格式,空输入也是非法#
#情况1.1输入错误格式
if not setTime.isValid():
# 情况1.1.1闹钟未启动,并且已勾选默认设置。无论格式是否空输入,只要非HH:mm:ss,都采取默认设置或上次存储设置
if self.chk_default.isChecked():
if self.btn_start.text() == "启动":
#读取默认设置
time_str = self.default_setTime
sound_str = self.default_setMessage
#设置闹钟
self.alarm_time = time_str#设置想起时间
self.btn_start.setText("关闭")#下次按btn_start为关闭闹钟
self.alarm_enable = True#使能闹钟
QMessageBox.information(self, "操作成功", "使用默认设置并开启闹钟")
self.lbl_showSetTime.setText(f"当前设定闹钟定的时间为:{time_str}")#显示设置时间
self.lbl_showSetSound.setText(sound_str)#显示设置播报语音文本
self.chk_default.setChecked(False)#重新可选checkbox
if self.alarm_enable == False:
self.btn_reset.setEnabled(True)
else:
self.btn_reset.setEnabled(False)
else:#情况1.1.2 未勾选默认设置,此时无论是否输入为空,都相当于输入错误格式
QMessageBox.warning(self, "错误", "请输入正确的时间格式(HH:mm:ss,例如:09:05:00)")
else:#情况1.2 输入格式正确,且闹钟未启动,启动闹钟。勾选默认设置,保存本次设置为默认
if self.btn_start.text() == "启动":
self.alarm_time = time_str#设置
self.btn_start.setText("关闭")
self.alarm_enable = True#闹钟使能
if self.chk_default.isChecked():
self.default_setTime = time_str#保存默认
self.default_setMessage = sound_str
QMessageBox.information(self, "操作成功", "保存默认设置并开启闹钟")
else:
QMessageBox.information(self, "操作成功", "开启闹钟(未保存)")
self.lbl_showSetTime.setText(f"当前设定闹钟定的时间为:{time_str}")
self.lbl_showSetSound.setText(sound_str) # 显示设置播报语音文本
self.chk_default.setChecked(False)#重新可选checkbox
# 避免清空按钮在闹钟启动后使用影响结果
if self.alarm_enable == False:
self.btn_reset.setEnabled(True)
else:
self.btn_reset.setEnabled(False)
else:#情况2闹钟已经启动关闭闹钟
self.btn_start.setText("启动")
self.alarm_enable = False#关闭闹钟
QMessageBox.information(self, "操作成功", "已经成功关闭闹钟")
if self.alarm_enable == False:
self.btn_reset.setEnabled(True)
else:
self.btn_reset.setEnabled(False)
#闹钟到点提示函数
def trigger_alarm(self):
#通过读取label而不是lineEdit,避免闹钟启动后,输入影响结果。因为每次启动按钮后,输入结果都会在label显示,所以没问题
##若为输入文本或者使用的默认设置为空文本,则播报“懒虫起床”
if self.lbl_message.text()=="": speech_message = "懒虫起床!好好学习,天天向上!"
#若不为空,则播报输出文本
else:speech_message = self.lbl_message.text()
#语音播报
self.speecher.say(speech_message)#首次播报语音,因为定时器需要等待7秒,所以先设置播报一次
# 初始化控制参数创建停止计时器
self.speech_count = 0 # 已播报次数可播报五次
self.stop_timer = QTimer(self)#总播报时长计时
self.stop_timer.timeout.connect(self.stop_alarm)
self.stop_timer.start(35000) # 每35秒触发一次,最长播报35s5次
# 创建播报定时器
self.alarm_timer = QTimer(self)
self.alarm_timer.timeout.connect(lambda: self.do_speech(speech_message))
self.alarm_timer.start(7000) # 每7秒触发一次,默认语音需要大概六秒,一共播报五次
QMessageBox.information(self, "时间到了", speech_message)#提示信息
self.alarm_enable = False#结束后重新对使能置0
# 可以再次设置新闹钟
self.btn_start.setText("启动")
#重心对清空按键使能
if self.alarm_enable == False:
self.btn_reset.setEnabled(True)
else:
self.btn_reset.setEnabled(False)
def do_speech(self, msg):#执行多次语音播报
if self.speech_count < 5:
self.speecher.say(msg) # 执行播报
self.speech_count += 1
def stop_alarm(self):#达到时间35s停止所有播报
self.alarm_timer.stop()
self.speecher.stop()
self.speech_count = 0 # 重置计数器
#默认设置与清空按钮,勾选默认,则恢复默认设置,否则只清空输入信息
def reset_setting(self):
#一个checkbox两用
if self.chk_default.isChecked():
#恢复默认设置
self.txt_setTime.clear()#清空
self.txt_setSound.clear()
self.chk_default.setChecked(False)
self.default_setTime = "08:30:00" # 默认设置时间
self.default_setMessage = "懒虫起床!好好学习" # 默认输出信息
QMessageBox.information(self, "操作成功", "已经恢复默认设置并清空输入信息")
else:
# 仅清空
QMessageBox.information(self, "操作成功","已经清空")
self.txt_setSound.clear()#清空
self.txt_setTime.clear()
self.chk_default.setChecked(False)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = AlarmClock()
window.setWindowTitle("学生九九新自用闹钟")
window.show()
sys.exit(app.exec())