Модуль потоков Python - GUI все еще зависает

Я создал сканер Twitter с графическим интерфейсом, который выбирает последние 20 твитов из любой учетной записи Twitter и сохраняет их в CSV-файл.

Сканер должен повторять сканирование каждые x минут (timeIntervall) в течение y раз (раз). Графический интерфейс зависает, когда сканер в данный момент занят, поэтому я попытался решить эту проблему с помощью потоков:

app = QtWidgets.QApplication(sys.argv)


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle("Twitter Crawler")
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.pushButton.clicked.connect(self.onPushButtonClick)

    def onPushButtonClick(self):

        def working(self):
            url = self.ui.urlInput.text()
            timeIntervall = self.ui.timeIntervall.text()
            seconds = timeIntervall.split(":")
            seconds = int(seconds[0]) * 60 * 60 + int(seconds[1]) * 60
            times = self.ui.crawlcount.value()
            fetcher = ArticleFetcher(url)
            print(times)
            firstFetch = True

            for count in range(0, times):
                if firstFetch:
                    fetcher.fetch()
                    firstFetch = False
                else:
                    time.sleep(seconds)
                    fetcher.fetch()

        worker = threading.Thread(target=working, args=(self,))
        worker.start()
        worker.join()

window = MainWindow()
window.show()
sys.exit(app.exec())

После ввода timeIntervall, раз и нажатия кнопки pushButton запускается рабочий поток, который обрабатывает сканирование. Приложение работает, но графический интерфейс по-прежнему зависает.

Я подозревал, что мне понадобится еще один поток для графического интерфейса и пробовал следующее:

def gui():
    window = MainWindow()
    window.show()
    sys.exit(app.exec())

rungui = threading.Thread(target=gui)
rungui.start()
rungui.join()

Теперь графический интерфейс открывается очень ненадолго, а затем сразу же закрывается.

Любые предложения, как решить эту проблему? Или, может быть, глупо не использовать модуль потоков PyQt?

1 ответ

Метод присоединения () Thread ожидает завершения потока. Когда вы запустите свой рабочий поток, пусть он запускается сам по себе. Если вам нужно отобразить его прогресс, используйте Очередь и отправляйте сообщения из рабочего потока в основной поток (используйте get_nowait() в некотором цикле таймера, чтобы увидеть, отправил ли рабочий поток что-то важное).

Другие вопросы по тегам