【发布时间】:2018-04-04 09:18:28
【问题描述】:
当我在doWork 方法中运行代码时,通过单击button1,进度条按预期工作。
但是,当我将列表从其他方法(即btn2、btn3)传递给doWork 方法时,进度条在启动后只会跳到100%。
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
from selenium import webdriver
class SeleniumWorker(QtCore.QObject):
progressChanged = QtCore.pyqtSignal(int)
def doWork(self, lst=['http://www.somesite.com/',
'http://www.somesite.com/page2',
'http://www.somesite.com/page3']):
progress = 0
browser = webdriver.Firefox()
links = lst
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)
button1 = QtWidgets.QPushButton("Start1")
button2 = QtWidgets.QPushButton("Start2")
button3 = QtWidgets.QPushButton("Start3")
lay.addWidget(progressBar)
lay.addWidget(button1)
lay.addWidget(button2)
lay.addWidget(button3)
self.thread = QtCore.QThread()
self.worker = SeleniumWorker()
self.worker.moveToThread(self.thread)
self.thread.started.connect(self.worker.doWork)
button1.clicked.connect(self.thread.start)
button2.clicked.connect(self.btn2)
button3.clicked.connect(self.btn3)
self.worker.progressChanged.connect(progressBar.setValue)
def btn2(self):
self.lst2 = ['http://www.somesite.com/page4',
'http://www.somesite.com/page5',
'http://www.somesite.com/page6']
self.worker.doWork(self.lst2)
def btn3(self):
self.lst3 = ['http://www.somesite.com/page7',
'http://www.somesite.com/page8',
'http://www.somesite.com/page9']
self.worker.doWork(self.lst3)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())
【问题讨论】:
-
按什么顺序点击按钮?不同的顺序是否会产生不同的结果(即不先单击 button1)?您是否尝试过从工作线程延迟和调试
progress打印? -
@handle 订单没有任何区别,只是当我第二次点击
button1时它不会执行。但是,我可以点击button2和button3任意次数,以任意顺序,我总是会得到相同的结果。 -
我刚刚安装了pyqt5和selenium plus geckodriver;进度条保持在 100%。可能与将对象移动到线程有关。我会玩一会儿...
-
要在线程中运行代码,您需要通过
QThread.start() -
@JoeT.Boka 在我的回答中,我已经用工作人员解释了 QThread 的操作,请检查它。 :D
标签: python selenium pyqt pyqt5 qprogressbar