PYQT6入门:3月15日作业 简易闹钟界面绘制与共功能实现

作业要求:输入闹钟设定时间,启动后,到点语音循环播报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())

默认设置

设置闹钟

响铃

关闭闹钟

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值