Передача аргумента при запуске нового QThread () в PyQt - PullRequest
4 голосов
/ 23 октября 2011

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

Итак, я хотел создать циклФункция в рабочем потоке, которая будет принимать один параметр (за исключением «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 (), но мне сказали "Rapid GUI development с PyQT" никогда , чтобы напрямую вызывать worker.run (), и всегда использовать worker.start ().

Ответы [ 2 ]

8 голосов
/ 23 октября 2011

Метод 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 голос
/ 21 августа 2014

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...