Python 建议GUI定时器显示后台线程';过了多久?

Python 建议GUI定时器显示后台线程';过了多久?,python,qt,pyqt,qthread,qtimer,Python,Qt,Pyqt,Qthread,Qtimer,问题 我有一个PyQt GUI,用户在其中按下按钮启动后台线程(workerThread,它是从QThread子类化的)。我希望有一个计时器显示(以QLabel的形式)来显示自从workerThread启动以来经过了多少时间,并且我希望这个计时器在workerThread退出后立即停止 可能的解决方案 我考虑过创建另一个独立线程(timerThread),它使用QTimer向插槽发送信号,以每1秒更新主GUI线程中的QLabel。此timerThread将在收到来自workerThread的终止

问题

我有一个PyQt GUI,用户在其中按下按钮启动后台线程(
workerThread
,它是从
QThread
子类化的)。我希望有一个计时器显示(以
QLabel
的形式)来显示自从
workerThread
启动以来经过了多少时间,并且我希望这个计时器在
workerThread
退出后立即停止

可能的解决方案

我考虑过创建另一个独立线程(
timerThread
),它使用
QTimer
向插槽发送信号,以每1秒更新主GUI线程中的
QLabel
。此
timerThread
将在收到来自
workerThread
的终止信号后立即退出

但是,我必须在
WorkerThread
的同时启动
timerThread
,我不知道该怎么做

问题


有没有更简单的方法?QTimer是否是一个正确的开始方法?

这里有一种方法。在本例中,
myThread
在调用
run
方法时,作为子进程启动
timerThread
。它的
timeappeased
信号连接到
timerThread
s
timeappeased
信号。
timerRead
将在
父级运行时每秒检查
,如果
为True
,则会发出
timeappeased
信号:

#!/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_())

回答得真好!阅读代码是一种乐趣。。。这一切都有道理。(这是我使用Qt/PyQt的第三天,我完全可以理解您的代码在做什么)。