关于 GUI 计时器显示后台线程已用时间的建议?

2024-05-06

Issue

我有一个 PyQt GUI,用户按下按钮即可启动后台线程(workerThread,它是从QThread)。我想要一个计时器显示(以QLabel) 显示自此以来已经过去了多少时间workerThread开始,我希望这个计时器在workerThread exits.

可能的解决方案

我考虑过创建另一个独立线程(timerThread)使用一个QTimer向插槽发送信号以更新QLabel在主 GUI 线程中,每 1 秒显示一次经过的时间。这timerThread一旦收到终止信号就会退出workerThread.

但是,我必须开始timerThread同时WorkerThread,我不知道该怎么做。

Question

有没有更简单的方法来做到这一点?是QTimer甚至是正确的开始方法?


这是执行此操作的一种方法。在这个例子中,myThread开始timerThread作为子进程时run方法被调用。它是timeElapsed信号连接到timerThreads timeElapsed信号。这timerThread每秒都会检查while the parent isRunning并发出一个timeElapsed信号如果True:

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import time

from PyQt4 import QtCore, QtGui

class timerThread(QtCore.QThread):
    timeElapsed = QtCore.pyqtSignal(int)

    def __init__(self, parent=None):
        super(timerThread, self).__init__(parent)
        self.timeStart = None

    def start(self, timeStart):
        self.timeStart = timeStart

        return super(timerThread, self).start()

    def run(self):
        while self.parent().isRunning():
            self.timeElapsed.emit(time.time() - self.timeStart)
            time.sleep(1)


class myThread(QtCore.QThread):
    timeElapsed = QtCore.pyqtSignal(int)
    def __init__(self, parent=None):
        super(myThread, self).__init__(parent)

        self.timerThread = timerThread(self)
        self.timerThread.timeElapsed.connect(self.timeElapsed.emit)

    def run(self):
        self.timerThread.start(time.time())

        iterations = 3
        while iterations:
            print "Running {0}".format(self.__class__.__name__)
            iterations -= 1
            time.sleep(2)        


class myWindow(QtGui.QWidget):    
    def __init__(self):
        super(myWindow, self).__init__() 

        self.button = QtGui.QPushButton(self)
        self.button.setText("Start Threading!")
        self.button.clicked.connect(self.on_button_clicked)

        self.label = QtGui.QLabel(self)

        self.layout = QtGui.QVBoxLayout(self)
        self.layout.addWidget(self.button)
        self.layout.addWidget(self.label)

        self.myThread = myThread(self)
        self.myThread.timeElapsed.connect(self.on_myThread_timeElapsed)
        self.myThread.finished.connect(self.on_myThread_finished)

    @QtCore.pyqtSlot()
    def on_button_clicked(self):
        self.myThread.start()

    @QtCore.pyqtSlot(int)
    def on_myThread_timeElapsed(self, seconds):
        self.label.setText("Time Elapsed: {0}".format(seconds))

    @QtCore.pyqtSlot()
    def on_myThread_finished(self):
        print "Done"

if __name__ == "__main__":
    import sys

    app = QtGui.QApplication(sys.argv)
    app.setApplicationName('myWindow')

    main = myWindow()
    main.show()

    sys.exit(app.exec_())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于 GUI 计时器显示后台线程已用时间的建议? 的相关文章

随机推荐