pan*_*ish 2 python qt multithreading pyqt qthread
我有一个简单的pyqt gui,它创建一个qthread来打开文件并读取一些信息.我想更新我gui的状态栏.通常,这将是我在状态栏上更新消息的函数调用:
class gui1(QtGui.QMainWindow):
def __init__(self, parent=None):
super(gui1, self).__init__(parent)
self.statusBar().showMessage("hello world")
...
# create thread here
self.mythread = WorkThread(text) # create instance and pass some text
self.mythread.finished.connect(self.threadDone) # signal emitted on finish of thread
self.mythread.start() # begin thread
Run Code Online (Sandbox Code Playgroud)
但是,更新线程内状态的调用不起作用.如何在qthread中更新gui的状态栏?
class WorkThread(QtCore.QThread):
def __init__(self,text):
self.text = text
QtCore.QThread.__init__(self)
def __del__(self):
self.wait()
def run(self):
self.ui.statusBar().showMessage(status) # WRONG SELF
return # must return, so that Qthread finished signal is emitted
Run Code Online (Sandbox Code Playgroud)
您绝不能尝试从GUI线程外部更新GUI.而是将自定义信号添加到工作线程并将其连接到GUI中的插槽:
class WorkThread(QtCore.QThread):
statusMessage = QtCore.pyqtSignal(object)
...
def run(self):
self.statusMessage.emit(self.text)
class gui1(QtGui.QMainWindow):
def __init__(self, parent=None):
super(gui1, self).__init__(parent)
self.mythread = WorkThread(text)
...
self.mythread.statusMessage.connect(self.handleStatusMessage)
@QtCore.pyqtSlot(object)
def handleStatusMessage(self, message):
self.ui.statusBar().showMessage(message)
Run Code Online (Sandbox Code Playgroud)