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

8 投票
2 回答
14217 浏览
提问于 2025-04-17 04:50

我有一个用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

QThreadstart 方法不接受任何参数。不过,由于你是继承了 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

撰写回答