欢迎访问宙启技术站
智能推送

PyQt5.QtCore.QTimer.singleShot()函数在多线程中的使用方法

发布时间:2023-12-23 17:40:18

在PyQt5中,使用QTimer.singleShot()函数可以创建一个单次的定时器,即在给定的时间间隔后执行一次特定的函数。

使用QWidget类重新实现这个函数,并在主线程和子线程中启动两个不同的单次定时器,以便演示在多线程中使用QTimer.singleShot()的方法。

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout
from PyQt5.QtCore import QTimer, Qt


class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.label = QLabel("Countdown: 5")
        self.layout = QVBoxLayout()
        self.layout.addWidget(self.label)
        self.setLayout(self.layout)
        self.counter = 5

    def update_label(self):
        if self.counter > 0:
            self.counter -= 1
            self.label.setText(f"Countdown: {self.counter}")

    def start_timer(self):
        # 启动单次定时器
        QTimer.singleShot(1000, self.update_label)


def main_thread():
    app = QApplication(sys.argv)
    widget = MyWidget()
    widget.show()
    widget.start_timer()
    sys.exit(app.exec_())


def worker_thread():
    app = QApplication(sys.argv)
    widget = MyWidget()
    widget.show()
    widget.start_timer()
    sys.exit(app.exec_())


if __name__ == "__main__":
    # 在主线程中启动定时器
    main_thread()

    # 在子线程中启动定时器
    # import threading
    # threading.Thread(target=worker_thread).start()

上述代码定义了一个自定义的QWidget子类MyWidget,其中包含一个QLabel用来显示倒计时信息。在主线程和子线程中的MyWidget对象都会启动一个单次定时器,每隔1秒调用一次update_label()函数更新倒计时信息并显示在QLabel上。正如您所看到的,如果将worker_thread()函数取消注释并在子线程中执行,您将会发现两个倒计时计时器同时在不同的窗口中进行倒计时。

然而,请注意,PyQt5是基于Qt的GUI框架,Qt中的GUI是线程安全的,这意味着只能在主线程中访问和操作GUI部件。因此,如果在子线程中使用QTimer.singleShot()函数,可能会导致不可预料的问题和错误。为了避免这种情况,请确保在主线程中使用QTimer.singleShot()函数以确保GUI的正常工作。