@Warlam

Многопоточность в Python (PyQt5)?

При нажати на кнопку запускается "долговременная" функция run(), в ней мне нужно редактировать виджеты или брать из них значения (к примеру взять текст из Qlineedit). Не понимаю, как можно это сделать
spoiler
class Worker(QObject):
    finished = pyqtSignal()

    def run(self, AuctionID_raw, Price, data3, AuctionID, place):
        while True:
        login = self.lineEdit.text()
        .
        .
        .

class mywindow(QtWidgets.QMainWindow):

     def btnCkicked_2(self):
        .
        .
        .

        self.thread = QThread()
        self.worker = Worker()
        self.worker.moveToThread(self.thread)
        self.thread.started.connect(self.worker.run(AuctionID_raw, Price, data3, AuctionID, place))
        self.worker.finished.connect(self.thread.quit)
        self.worker.finished.connect(self.worker.deleteLater)
        self.thread.finished.connect(self.thread.deleteLater)
        self.thread.start()
  • Вопрос задан
  • 535 просмотров
Решения вопроса 1
@bbkmzzzz
Все взаимодействие потоков и графики - выносить в сигналы.
You must pass to it all the data it needs to work with
- загружайте перед стартом все необходимые данные, если данные изменились, и воркеру надо их получить, отсылайте воркеру с помощью сигнала. Когда воркер сделал часть, результат он отсылает в сигнале.
Весь Qt работает на сигналах, в многопоточном режиме разници не сильно много, только в том, что для взаимодействия с графикой нужно использовать только сигналы.

UPD, у moveToThread есть особенность, все слоты класса будут выполнятьсяв отдельном потоке.
В таком виде, как есть сейчас, вам будет очень сложно в многопоток у Qt. Классы, поля, экземпляры, общая структура приложения, система сигналов\слотов Qt, события, варианты потоков (QThread, QRunnable, QThreadPool) - про все про это надо читать и учить питон.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы