Python 建议GUI定时器显示后台线程';过了多久?
问题 我有一个PyQt 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的终止
workerThread
,它是从QThread
子类化的)。我希望有一个计时器显示(以QLabel
的形式)来显示自从workerThread
启动以来经过了多少时间,并且我希望这个计时器在workerThread
退出后立即停止
可能的解决方案
我考虑过创建另一个独立线程(timerThread
),它使用QTimer
向插槽发送信号,以每1秒更新主GUI线程中的QLabel
。此timerThread
将在收到来自workerThread
的终止信号后立即退出
但是,我必须在WorkerThread
的同时启动timerThread
,我不知道该怎么做
问题
有没有更简单的方法?QTimer是否是一个正确的开始方法?这里有一种方法。在本例中,
myThread
在调用run
方法时,作为子进程启动timerThread
。它的timeappeased
信号连接到timerThread
stimeappeased
信号。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的第三天,我完全可以理解您的代码在做什么)。