Многопоточное приложение Python PyQT GUI с Selenium WebDriver - Как обеспечить закрытие Webdriver при выходе из приложения? - PullRequest
0 голосов
/ 17 апреля 2019

Я все еще новичок в python и ОЧЕНЬ новичок в реализации GUI и многопоточности, я написал небольшое приложение, которое использует selenium для сбора данных и взаимодействия с веб-сайтом, эта часть работает отлично, GUI работает нормально, моя проблема гарантирует, что Chrome закрывается, если приложение закрывается без завершения.

Я пытался создать класс webdriver за пределами класса с резьбой, чтобы его можно было завершить, я не мог добиться, чтобы это имело какой-либо эффект, я также пытался обратиться к объекту webdriver извне класса, в котором это работает, после нескольких часов поиска должен быть легкий (или более простой) способ, которым я просто не понимаю ...

class Worker(QRunnable):
    #Worker Thread
    def __init__(self, *args, **kwargs):
        super(Worker, self).__init__()
        self.args = args
        self.kwargs = kwargs
        self.signals = WorkerSignals()
        self.kwargs['progress_callback'] = self.signals.status

    def run(self):
            This is where selenium runs etc, this is where the 
            webdriver object is located that i need to terminate from 
            outside the 'Worker' thread.

И пример кода GUI, массово урезанный просто для примера, у меня уже есть обработчик closeEvent, я просто не могу на всю жизнь понять, как отключить веб-драйвер, чтобы браузер закрывался. если графический интерфейс пользователя закрыт до завершения работы потока ...

class myWindow(QtWidgets.QMainWindow, Ui_MainWindow):

    def __init__(self, parent=None):
        super(myWindow, self).__init__(parent, QtCore.Qt.WindowStaysOnTopHint)
        self.setupUi(self)
        self.show()
        self.move(0,0)
        self.threadpool = QThreadPool()
        self.pushButton.clicked.connect(self.btnClicked)

    def btnClicked(self):
        user = self.userEdit.text()
        password = self.passwordEdit.text()
        url = self.urlEdit.text()
        worker = Worker(user,password,url)
        worker.signals.status.connect(self.statusUpdate)
        worker.signals.progress.connect(self.progressUpdate)
        self.threadpool.start(worker)

    def closeEvent(self, *args, **kwargs):
        super(QtWidgets.QMainWindow, self).closeEvent(*args, **kwargs)
        print('Closed')


if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)
    ex = myWindow()
    sys.exit(app.exec_())

Мне нужно, чтобы решение подходило для macOS и Windows, поэтому в идеале должно быть действие, выполняемое внутри самого приложения без вызова каких-либо внешних функций kill ...

Если бы кто-нибудь мог помочь, это было бы здорово! Или даже просто направь меня в правильном направлении ... Это было бы очень ценно ...

Заранее спасибо ...

...