回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我正在尝试使用qthread运行worker类。如果用workerObject=workerClass()实例化worker,我可以毫无问题地完成这项工作。如果工人类需要始终执行<strong>退出</strong>,我该怎么做?你知道吗</p>
<p>下面是一个尝试这样做的示例代码。不幸的是,通过运行它,<strong>exit</strong>函数无法执行,这很可能是因为线程不知道with/as语句</p>
<pre><code>from PyQt4 import QtCore, QtGui
from PyQt4.QtCore import QThread, QObject, pyqtSignal, pyqtSlot
import sys
import time
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(400, 284)
self.textEdit = QtGui.QTextEdit(Dialog)
self.textEdit.setGeometry(QtCore.QRect(20, 20, 361, 191))
self.textEdit.setObjectName(_fromUtf8("textEdit"))
self.pushButton = QtGui.QPushButton(Dialog)
self.pushButton.setGeometry(QtCore.QRect(170, 250, 75, 23))
self.pushButton.setObjectName(_fromUtf8("pushButton"))
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
Dialog.setWindowTitle(_translate("Dialog", "Dialog", None))
self.pushButton.setText(_translate("Dialog", "Print", None))
class UI_MainWindow(QtGui.QMainWindow, Ui_Dialog):
def __init__(self, parent=None):
super(UI_MainWindow, self).__init__(parent)
self.setupUi(self)
self.pushButton.clicked.connect(self.run)
def run(self):
self.t = QThread()
self.x = None
with worker() as self.x:
self.x.signal.connect(self.write)
self.x.moveToThread(t)
t.started.connect(self.x.run)
t.start()
@pyqtSlot(str)
def write(self, text):
self.textEdit.append("Running")
qtObject.processEvents()
class worker(QObject):
signal = pyqtSignal(str)
def __init__(self, parent = None):
super(worker, self).__init__(parent)
def __enter__(self):
return self
def run(self):
self.signal.emit("Running")
time.wait(5)
raise Exception
def __exit__(self, exc_type, exc_value, traceback):
if exc_type:
self.signal.emit("Exception")
def main(qtObject, guiObj):
guiObj.show()
qtObject.exec_()
qtObject.processEvents()
qtObject = QtGui.QApplication(sys.argv)
guiObj = UI_MainWindow()
main(qtObject, guiObj)
</code></pre>
<p>LE:上下文需要在QTextEdit窗口中打印来自worker类的任何失败消息。在worker类执行期间引发的任何异常都将在其exit函数中处理,这样无论发生什么错误,脚本都将优雅地结束,为用户提供有意义的信息和指令。你知道吗</p>