Модуль потоков 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() в некотором цикле таймера, чтобы увидеть, отправил ли рабочий поток что-то важное).