day5闹钟

import sys
from PySide6.QtCore import QTime, QTimer, Qt
from PySide6.QtWidgets import QWidget, QApplication, QPushButton, QLabel, QLineEdit, QMessageBox
from PySide6.QtTextToSpeech import QTextToSpeech
from Form import Ui_Form


class MyWidget(Ui_Form, QWidget):
    def __init__(self):
        super().__init__()
        # 加载 UI 界面,将 UI 中的控件初始化到 self 上
        self.setupUi(self)

        # 获取 UI 上的组件
        # 若 UI 文件中定义的对象名称与这里一致,则可以直接使用
        # 如:self.Btn, self.TimeLab, self.ClockLab, self.TxtLab, self.TimeEdit

        # 绑定事件:QPushButton 的 clicked 信号和 QLineEdit 的 textChanged 信号
        self.Btn.clicked.connect(self.Btn_slot)
        self.TimeEdit.textChanged.connect(self.TimeEdit_slot)

        # 初始化 TTS(语音播报),并连接 stateChanged 信号
        self.tts = QTextToSpeech(self)
        self.tts.stateChanged.connect(self.handle_state_changed)
        self.speech_count = 0  # 用于记录已播报次数

        # 定义一个定时器,每秒更新一次系统时间
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.update_time)
        self.timer.start(1000)  # 每 1000 ms 触发一次

        # 闹钟相关变量
        self.alarm_time = None       # 存储闹钟时间(QTime 对象)
        self.alarm_active = False    # 是否启动闹钟
        self.alarm_triggered = False # 防止同一分钟内重复触发

    def update_time(self):
        # 每秒调用,用于更新 TimeLab 显示系统时间,并检查是否到达闹钟时间。
        current_time = QTime.currentTime()
        self.TimeLab.setText(current_time.toString("HH:mm:ss"))

        # 检查闹钟触发(只比较时和分)
        if self.alarm_active and not self.alarm_triggered and self.alarm_time is not None:
            if (current_time.hour() == self.alarm_time.hour() and
                    current_time.minute() == self.alarm_time.minute()):
                self.alarm_triggered = True
                self.speech_count = 0
                self.text_to_speak = self.TxtLab.text()
                # 开始第一次播报
                self.tts.say(self.text_to_speak)

    def handle_state_changed(self, state):
        # 当 TTS 状态变化时调用。状态变为 Ready 表示上一段播报结束,
        # 此时如果播报次数不足 5 次,则继续播报。
        if state == QTextToSpeech.State.Ready:
            self.speech_count += 1
            if self.speech_count < 5:
                self.tts.say(self.text_to_speak)

    def TimeEdit_slot(self):
        # 当用户在 TimeEdit 上修改时间时,将该时间显示到 ClockLab 上。
        time_str = self.TimeEdit.text()
        alarm = QTime.fromString(time_str, "HH:mm")
        if alarm.isValid():
            self.ClockLab.setText(alarm.toString("HH:mm"))
        else:
            self.ClockLab.setText("Invalid Time")

    def Btn_slot(self):
        # 当点击“启动”按钮时,设置闹钟时间并启用闹钟。
        alarm_str = self.ClockLab.text()
        self.alarm_time = QTime.fromString(alarm_str, "HH:mm")
        if self.alarm_time.isValid():
            self.alarm_active = True
            self.alarm_triggered = False  # 重新允许触发
        else:
            QMessageBox.warning(self, '提示', '闹钟时间无效', QMessageBox.StandardButton.Ok)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    myWidget = MyWidget()
    # 去掉窗口边框
    myWidget.setWindowFlag(Qt.WindowType.FramelessWindowHint)
    # 设置窗口背景透明
    myWidget.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground)
    myWidget.show()
    sys.exit(app.exec())

样式:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值