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())
样式: