Long Process 中的 PYQT 和进度条
PYQT and progress Bar during Long Process
我正在尝试制作一个 运行 的脉动进度条,在我正在 运行 的漫长过程中,完成后它将完全变为绿色。我在这里阅读了一些以前的 post 但我无法弄清楚我需要的线程。
import time
from PyQt4 import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName(_fromUtf8("Form"))
Form.resize(770, 726)
self.progressBar = QtGui.QProgressBar(Form)
self.progressBar.setGeometry(QtCore.QRect(150, 590, 118, 23))
self.progressBar.setProperty("value", 24)
self.progressBar.setTextVisible(False)
self.progressBar.setObjectName(_fromUtf8("progressBar"))
self.pushButton = QtGui.QPushButton(Form)
self.pushButton.setGeometry(QtCore.QRect(25, 50, 170, 40))
self.pushButton.setObjectName(_fromUtf8("pushButton"))
self.pushButton.clicked.connect(self.onStart)
self.myLongTask = TaskThread()
self.myLongTask.taskFinished.connect(self.onFinished)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def onStart(self):
self.progressBar.setRange(0,0)
self.myLongTask.start()
def onFinished(self):
# Stop the pulsation
self.progressBar.setRange(0,1)
def retranslateUi(self, Form):
Form.setWindowTitle(_translate("Form", "Form", None))
self.pushButton.setText(_translate("Form", "Run", None))
def test(self):
for i in xrange(500000):
print i
class TaskThread(QtCore.QThread):
taskFinished = QtCore.pyqtSignal()
def run(self):
time.sleep(3)
self.taskFinished.emit()
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
Form = QtGui.QWidget()
ui = Ui_Form()
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())
现在,条形图在跳动。它永远不会进入测试定义。我知道这是因为我没有正确调用它,但我不确定如何同时让条形图脉动和 def 测试 运行。
test()
方法与您当前设计的进度条无关。 TaskThread.run()
方法必须在其 long-运行 操作的当前进度中发出一些信号。此信号必须连接到插槽 progressBar.setValue()
。因此,当 TaskThread
中的操作稍有进展时,会向进度条发送一个信号,以实际更新新进度。
这是一个大纲,为了简洁我省略了很多代码
class Ui_Form():
__init__(self, Form):
# Omitted
# Connect progress of task thread with progress bar
myLongTask.valueChanged.connect(self.progressBar.setValue)
def onStart(self):
# QProgressBar uses integers to represent range and value
self.progressBar.setRange(0, 100)
self.myLongTask.start()
class TaskThread():
valueChanged = QtCore.pyqtSignal(int)
def run():
for i in range(100):
time.sleep(0.01) # Do "work"
self.valueChanged.emit(i) # Notify progress bar to update via signal
self.taskFinished.emit()
好吧,要让 test()
方法在进度条旋转时起作用,您可以这样做:
class TaskThread(QtCore.QThread):
taskFinished = QtCore.pyqtSignal()
def run(self):
# instead of sleeping do the long running loop
for i in xrange(500000):
print i
self.taskFinished.emit()
并从 Ui_form
中删除 test()
方法。整个想法是你 需要 在另一个线程中执行长 运行 任务,而不是主线程处理主 window。
我正在尝试制作一个 运行 的脉动进度条,在我正在 运行 的漫长过程中,完成后它将完全变为绿色。我在这里阅读了一些以前的 post 但我无法弄清楚我需要的线程。
import time
from PyQt4 import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName(_fromUtf8("Form"))
Form.resize(770, 726)
self.progressBar = QtGui.QProgressBar(Form)
self.progressBar.setGeometry(QtCore.QRect(150, 590, 118, 23))
self.progressBar.setProperty("value", 24)
self.progressBar.setTextVisible(False)
self.progressBar.setObjectName(_fromUtf8("progressBar"))
self.pushButton = QtGui.QPushButton(Form)
self.pushButton.setGeometry(QtCore.QRect(25, 50, 170, 40))
self.pushButton.setObjectName(_fromUtf8("pushButton"))
self.pushButton.clicked.connect(self.onStart)
self.myLongTask = TaskThread()
self.myLongTask.taskFinished.connect(self.onFinished)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def onStart(self):
self.progressBar.setRange(0,0)
self.myLongTask.start()
def onFinished(self):
# Stop the pulsation
self.progressBar.setRange(0,1)
def retranslateUi(self, Form):
Form.setWindowTitle(_translate("Form", "Form", None))
self.pushButton.setText(_translate("Form", "Run", None))
def test(self):
for i in xrange(500000):
print i
class TaskThread(QtCore.QThread):
taskFinished = QtCore.pyqtSignal()
def run(self):
time.sleep(3)
self.taskFinished.emit()
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
Form = QtGui.QWidget()
ui = Ui_Form()
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())
现在,条形图在跳动。它永远不会进入测试定义。我知道这是因为我没有正确调用它,但我不确定如何同时让条形图脉动和 def 测试 运行。
test()
方法与您当前设计的进度条无关。 TaskThread.run()
方法必须在其 long-运行 操作的当前进度中发出一些信号。此信号必须连接到插槽 progressBar.setValue()
。因此,当 TaskThread
中的操作稍有进展时,会向进度条发送一个信号,以实际更新新进度。
这是一个大纲,为了简洁我省略了很多代码
class Ui_Form():
__init__(self, Form):
# Omitted
# Connect progress of task thread with progress bar
myLongTask.valueChanged.connect(self.progressBar.setValue)
def onStart(self):
# QProgressBar uses integers to represent range and value
self.progressBar.setRange(0, 100)
self.myLongTask.start()
class TaskThread():
valueChanged = QtCore.pyqtSignal(int)
def run():
for i in range(100):
time.sleep(0.01) # Do "work"
self.valueChanged.emit(i) # Notify progress bar to update via signal
self.taskFinished.emit()
好吧,要让 test()
方法在进度条旋转时起作用,您可以这样做:
class TaskThread(QtCore.QThread):
taskFinished = QtCore.pyqtSignal()
def run(self):
# instead of sleeping do the long running loop
for i in xrange(500000):
print i
self.taskFinished.emit()
并从 Ui_form
中删除 test()
方法。整个想法是你 需要 在另一个线程中执行长 运行 任务,而不是主线程处理主 window。