制作一个简单的定时语音播报器:使用PyQt6

今天我要和大家分享一个简单的项目——使用PyQt6制作一个定时语音播报器。这个小工具可以帮助你在设定的时间提醒你,或者在特定时间播放一段文本。下面是如何一步步构建这个应用的详细指南。

创建主窗口类

首先我们创建了一个名为MyWidget的类,它继承自QWidget。这个类将包含我们的GUI组件和逻辑。

class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        ui = uic.loadUi('./form.ui',self)

这里,我们使用uic.loadUi加载了一个预先设计好的UI文件form.ui,这个文件定义了我们的界面布局。

设置GUI组件

__init__方法中,我们设置了各种GUI组件,包括按钮、标签、文本输入框和文本编辑框。

        self.Btn:QPushButton = ui.btn   #启动按钮
        self.label:QLabel = ui.label    #显示系统时间
        self.timeedit:QLineEdit = ui.timeedit     #输入设定的时间
        self.textEdit:QTextEdit = ui.textEdit     #输入要播报的内容

定时器和语音播报器

我们实例化了一个QTimer对象用于定时任务,以及一个QTextToSpeech对象用于文本到语音的转换。

        #实例化一个时间事件类对象
        self.timer = QTimer()
        # 实例化一个语音播报者
        self.speecher = QTextToSpeech()

信号和槽

PyQt6使用信号和槽机制来处理事件。我们连接了按钮的点击事件到一个槽函数,以及定时器的超时信号到另一个槽函数。

        self.Btn.clicked.connect(self.Btn_slot)
        self.timer.timeout.connect(self.timerEvent)

启动和停止定时器

Btn_slot方法中,我们根据按钮的文本来决定是启动还是停止定时器。

    #启动按钮对应的槽函数
    def Btn_slot(self):
        if self.Btn.text() == "启动":
            # 启动一个定时器
            self.id = self.startTimer(1000)  # 每隔1秒钟
            self.Btn.setText("关闭")
        else:
            # 关闭定时器
            self.killTimer(self.id)
            self.Btn.setText("启动")

定时器事件处理

timerEvent方法中,我们更新标签以显示当前系统时间,并检查是否到达了设定的时间。如果到达了设定的时间,我们就使用语音播报器播放用户输入的文本。

    def timerEvent(self, e:QTimerEvent):
        #判断定时器超时
        if e.timerId() == self.id:
            #获取系统时间
            sys_time = QTime.currentTime()
            # 将系统时间转换成字符串格式
            t = sys_time.toString("hh:mm:ss")
            #将系统时间放入到label中显示
            self.label.setText(t)
            #居中显示
            self.label.setAlignment(Qt.AlignmentFlag.AlignCenter)
        #判断label显示的时间是否与输入的时间相匹配,匹配则开始语音播报
        if self.label.text() == self.timeedit.text():
            self.speecher.say(self.textEdit.toPlainText())

运行应用

最后,我们创建一个应用实例并运行它。

if __name__=="__main__":
    app=QApplication(sys.argv)
    myWidget=MyWidget()
    myWidget.show()
    sys.exit(app.exec())

最后附上整个代码:

import sys

from PyQt6 import uic
from PyQt6.QtCore import Qt, QTimer, QTimerEvent, QTime
from PyQt6.QtGui import QPaintEvent, QPainter, QFont, QColor
from PyQt6.QtTextToSpeech import QTextToSpeech
from PyQt6.QtWidgets import QWidget, QApplication, QPushButton, QLabel, QLineEdit, QTextEdit


class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        ui = uic.loadUi('./form.ui',self)

        self.Btn:QPushButton = ui.btn   #启动按钮
        self.label:QLabel = ui.label    #显示系统时间
        self.timeedit:QLineEdit = ui.timeedit     #输入设定的时间
        self.textEdit:QTextEdit = ui.textEdit     #输入要播报的内容

        #实例化一个时间事件类对象
        self.timer = QTimer()
        # 实例化一个语音播报者
        self.speecher = QTextToSpeech()

        #信号和槽的连接
        self.Btn.clicked.connect(self.Btn_slot)
        self.timer.timeout.connect(self.timerEvent)


    #启动按钮对应的槽函数
    def Btn_slot(self):
        if self.Btn.text() == "启动":
            # 启动一个定时器
            self.id = self.startTimer(1000)  # 每隔1秒钟
            self.Btn.setText("关闭")
        else:
            # 关闭定时器
            self.killTimer(self.id)
            self.Btn.setText("启动")



    def timerEvent(self, e:QTimerEvent):

        #判断定时器超时
        if e.timerId() == self.id:
            #获取系统时间
            sys_time = QTime.currentTime()
            # 将系统时间转换成字符串格式
            t = sys_time.toString("hh:mm:ss")
            #将系统时间放入到label中显示
            self.label.setText(t)
            #居中显示
            self.label.setAlignment(Qt.AlignmentFlag.AlignCenter)
        #判断label显示的时间是否与输入的时间相匹配,匹配则开始语音播报
        if self.label.text() == self.timeedit.text():
            self.speecher.say(self.textEdit.toPlainText())


if __name__=="__main__":
    app=QApplication(sys.argv)

    myWidget=MyWidget()

    myWidget.show()

    sys.exit(app.exec())

附上今日学习的思维导图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值