Python PyQt QProgressBar在与Selenuim一起使用时不工作
我构建了一个PyQt5 GUI来进行一些Selenium测试。除PyQt进度条外,所有操作都按预期进行 在下面的第一个示例中,我使用Selenium浏览器,当浏览器关闭时,进度条在最后跳到100%。但是,硒的作用与预期一样Python PyQt QProgressBar在与Selenuim一起使用时不工作,python,selenium,pyqt,pyqt5,qprogressbar,Python,Selenium,Pyqt,Pyqt5,Qprogressbar,我构建了一个PyQt5 GUI来进行一些Selenium测试。除PyQt进度条外,所有操作都按预期进行 在下面的第一个示例中,我使用Selenium浏览器,当浏览器关闭时,进度条在最后跳到100%。但是,硒的作用与预期一样 def test(self): self.completed = 0 browser = webdriver.Firefox() links = ['http://www.somesite.com/', 'http://www.
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()
但是,在下面的这个版本中,当Selenium浏览器被注释掉后,进度条会按预期工作
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执行的正常任务(如票证检查、重绘等)被执行 在这些情况下,解决方案是使用线程执行阻塞任务,并使用信号发送信息
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_())
在不同的线程上运行GUI。@FlorentB。我的项目是以这样的方式组织的,我不认为我能把我的头绕在那上面。你能分享更多的细节吗?谢谢。这太棒了!但是,不幸的是,我仍然不能使用它,因为我需要为几个不同的功能使用进度条。不止一个。您能告诉我如何在其他方法中使用此解决方案处理其他列表吗?@JoeT.Boka您了解您当前的需求有点混乱,如果您提供一个更清晰的解释,例如什么百分比代表每个函数的执行,我可以帮您。谢谢。我将创建并提供一个新的示例,以更清楚地说明当前的问题。新问题发布后,我会通知您。再次感谢。我发布了一个关于当前问题的例子。希望它有意义。请看一看。