在PyQt中启动新QThread()时传递参数
我有一个用Python写的多线程应用程序,其中一个线程负责处理图形界面(GUI),另一个是工作线程。不过,工作线程有两个主要的功能(可以说是两个主要的任务),我需要告诉运行函数到底要做哪个任务。
我想的办法是,在工作线程里创建一个运行函数,这个函数会接受一个参数(除了“self”以外)。这个参数可以是“create”或者“upload”。下面是我目前写的一些代码:
GUI.py
class GUI(QMainWindow):
def __init__(self, parent=None):
super, etc
self.worker = worker.Worker()
def create(self):
self.worker.start()
def upload(self):
self.worker.start()
Worker.py
class Worker(QThread):
def __init__(self, parent=None):
super, etc
def run(self):
self.create_data() # OR self.upload_data(), depends
所以我的问题是,如何告诉worker.start()我想让它执行哪个功能?我知道可以直接使用worker.run()方法,但我被告知在“用PyQT快速开发图形界面”中,绝对不要直接调用worker.run(),而是应该始终使用worker.start()。
2 个回答
1
Eli Bendersky的回答是对的,不过参数的顺序好像不太对。
如果你这样调用Worker类:
对我来说,正确的参数顺序是:
def __init__(self, parent=None, do_create_data=True):
Eli Bendersky的回答中显示的顺序给我带来了这个错误信息:
TypeError: QThread(QObject parent=None): argument 1 has unexpected type 'str'
我也不太明白为什么,不过我相信有人能帮忙解释一下。
14
QThread
的 start
方法不接受任何参数。不过,由于你是继承了 QThread
,所以你可以随意进行自定义。因此,要实现你想要的功能,只需在 Worker
的构造函数中传入参数即可。
下面是你代码的一个小修改示例,展示了这个实现:
class Worker(QThread):
def __init__(self, do_create_data=True, parent=None):
super(QThread, self).__init__()
self.do_create_data = create_data
def run(self):
if self.create_data:
self.create_data()
else:
self.upload_data(), depends