Python 在PyQt中启动新QThread()时传递参数

Python 在PyQt中启动新QThread()时传递参数,python,multithreading,pyqt,Python,Multithreading,Pyqt,我有一个用Python编写的多线程应用程序,其中一个线程“负责”GUI,另一个线程是工作线程。但是,辅助线程有两个主要函数(或者说是两个主要作业),我需要告诉run函数到底要执行哪个作业 因此,我的想法是在工作线程中创建一个运行函数,该函数将接受一个参数(保存为“self”)。该参数将是“create”或upload。无需进一步讨论,以下是我迄今为止的代码: GUI.py class GUI(QMainWindow): def __init__(self, parent=None):

我有一个用Python编写的多线程应用程序,其中一个线程“负责”GUI,另一个线程是工作线程。但是,辅助线程有两个主要函数(或者说是两个主要作业),我需要告诉run函数到底要执行哪个作业

因此,我的想法是在工作线程中创建一个运行函数,该函数将接受一个参数(保存为“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进行快速GUI开发”告诉我永远不要直接调用worker.run(),而总是使用worker.start()方法

下面是经过轻微修改的代码示例,以显示实际情况:

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

伊莱·本德斯基的回答是正确的,但争论的顺序似乎是错误的

如果您这样调用工人类:

对我有效的论点顺序:

def __init__(self, parent=None, do_create_data=True):  
Eli Bendersky回答中显示的顺序为我生成了以下错误消息:

TypeError: QThread(QObject parent=None): argument 1 has unexpected type 'str'

不知道为什么,但我相信有人可以帮助解释。

@Deusdies upload_data()是同一线程的函数?如何将一行作为参数发送?请您解释一下
super,etc
的意思?@Nateshbhat
super(QThread,self)。\uu init\uuuu()
。我将更改原始帖子。将
parent
参数作为最后一个可选参数。因为它没有被使用,所以您甚至可以将其删除。