当我与selenuim一起使用时,pyqt qprogressbar无法正常工作



我构建了一个pyqt5 gui来进行一些硒测试。除了PYQT进度栏外,一切都按预期工作。

在下面的第一个示例中,在我使用硒浏览器的情况下,当浏览器关闭时,进度条就跳到100%。但是,硒可以按预期工作。

def test(self):
        self.completed = 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)
            self.completed += 100 / len(links)
            time.sleep(2)
            print(link)
            self.progressBar.setValue(self.completed)
        browser.close()

但是,在下面的此版本中,随着硒浏览器的评论,进度条按预期工作。

def test(self):
        self.completed = 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)
            self.completed += 100 / len(links)
            time.sleep(2)
            print(link)
            self.progressBar.setValue(self.completed)
        #browser.close()

阻止任务与事件循环不友好,在该事件循环中执行了GUI,因为它们可以防止GUI执行的正常任务,例如票务检查,重写等等。/p>

在这些情况下,解决方案是使用线程执行阻止任务并使用信号发送信息。

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_())

相关内容

  • 没有找到相关文章

最新更新