Передача аргумента при запуске нового QThread() в PyQt

#python #multithreading #pyqt

#python #многопоточность #pyqt

Вопрос:

У меня есть многопоточное приложение, написанное на Python, в котором один поток «заботится» о графическом интерфейсе, а другой — рабочий поток. Однако рабочий поток имеет две основные функции (или, так сказать, два основных задания), и мне нужно указать функции run, какую именно работу выполнять.

Итак, я имел в виду создать функцию run в рабочем потоке, которая будет принимать один параметр (за исключением «self). Параметр будет либо «создать», либо загрузить. Без дальнейших церемоний, вот некоторый код, который у меня есть до сих пор:

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() .

Ответ №1:

start Метод QThread не принимает аргументы. Однако вы унаследовали 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
  

Комментарии:

1. @Deusdies upload_data() является функцией того же потока? Как можно отправить строку в качестве аргумента?

2. Не могли бы вы объяснить, что super, etc это значит?

3. @Nateshbhat super(QThread, self).__init__() . Я изменю исходное сообщение.

Ответ №2:

Ответ Эли Бендерского правильный, однако порядок аргументов кажется неправильным.

Если вы вызываете рабочий класс следующим образом:

Порядок аргументов, который сработал для меня:

 def __init__(self, parent=None, do_create_data=True):  
  

Порядок, указанный в ответе Эли Бендерского, выдал мне это сообщение об ошибке:

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

Не уверен, почему, но я уверен, что кто-нибудь может помочь объяснить.

Комментарии:

1. Поместите parent параметр в качестве последнего необязательного параметра. Поскольку он не используется, вы даже можете избавиться от него.