PyQt QProgressBar not working when I use it with Selenuim

后端 未结 1 1524
傲寒
傲寒 2020-11-27 08:31

I built a PyQt5 GUI to do some Selenium testing. Everything works as expected, except for the PyQt progress bar.

In the first example below, where I use the Selenium

相关标签:
1条回答
  • 2020-11-27 09:17

    The blocking tasks are not friendly with the event loop where the GUI is executed as they prevent the normal tasks that the GUI performs such as ticket checking, redrawing, etc. from being executed.

    The solution in these cases is to use thread to execute the blocking task and use the signals to send the information.

    import sys
    
    from PyQt5 import QtCore, QtWidgets
    
    from selenium import webdriver
    
    class SeleniumWorker(QtCore.QObject):
        progressChanged = QtCore.pyqtSignal(int)
        def doWork(self):
            progress = 0
            browser = webdriver.Firefox()
            links = ['http://www.somesite.com/',
            'http://www.somesite.com/page2',
            'http://www.somesite.com/page3']
            for link in links:
                browser.get(link)
                progress += 100 / len(links)
                self.progressChanged.emit(progress)
            browser.close()
    
    class Widget(QtWidgets.QWidget):
        def __init__(self, *args, **kwargs):
            QtWidgets.QWidget.__init__(self, *args, **kwargs)
            lay = QtWidgets.QHBoxLayout(self)
            progressBar = QtWidgets.QProgressBar()
            progressBar.setRange(0, 100)
            button = QtWidgets.QPushButton("Start")
            lay.addWidget(progressBar)
            lay.addWidget(button)
            self.thread = QtCore.QThread()
            self.worker = SeleniumWorker()
            self.worker.moveToThread(self.thread)
            self.thread.started.connect(self.worker.doWork)
            button.clicked.connect(self.thread.start)
            self.worker.progressChanged.connect(progressBar.setValue, QtCore.Qt.QueuedConnection)
    
    
    if __name__ == '__main__':
        app = QtWidgets.QApplication(sys.argv)
        w = Widget()
        w.show()
        sys.exit(app.exec_())
    
    0 讨论(0)
提交回复
热议问题