【发布时间】:2019-05-10 01:21:53
【问题描述】:
我正在尝试关注this guide,让长时间运行的方法在单独的线程中运行。该功能正在运行,但在方法运行时仍会导致 GUI 冻结。我是否遗漏了一些可以让它在单独的线程中运行的东西?
from PySide2.QtWidgets import QDialog, QApplication, QMainWindow
from PySide2.QtCore import Qt, QThread, SIGNAL
import time
class MyClient():
'''Members of this class get passed to the QThread subclass instance in order to "doSomething" in a separate thread'''
def __init__(self, name):
self.name = name
def doSomething(self):
time.sleep(10) # but really do something more useful
return self.name
class WorkerThread(QThread):
'''Supposed to perform operation in a separate thread so GUI remains responsive.'''
def __init__(self, client):
super().__init__()
self.client = client
def __del__(self):
self.wait()
def run(self):
print("Running!!!")
return self.client.doSomething()
class MyForm(QMainWindow):
def __init__(self, clients):
super().__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.clients = clients
# Connect button to method
self.ui.btn_fetch.clicked.connect(self.fetch)
self.show()
self.fetch()
def printName(self, name):
print(name)
def fetch(self):
for client in self.clients:
self.workerThread = WorkerThread(client)
self.connect(self.workerThread, SIGNAL("printName(QString)"), self.printName)
print("Starting thread")
self.workerThread.start()
# GUI becomes unresponsive here until the workerThread finishes.
print("Thread started")
if __name__ == "__main__":
clients = [MyClient('foo'), MyClient('bar'), MyClient('baz')]
app = QApplication(sys.argv)
w = MyForm(clients)
w.show()
sys.exit(app.exec_())
【问题讨论】:
标签: python python-3.x pyqt5 qthread pyside2