#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
параметр в качестве последнего необязательного параметра. Поскольку он не используется, вы даже можете избавиться от него.