PyQt 进度条直到 100% 才更新或出现 [英] PyQt progress bar not updating or appearing until 100%
问题描述
在 PyQt4 进度条上有许多类似的帖子没有更新.他们都专注于线程和线程的问题.程序实际更新窗口的地方.虽然有帮助,但我的代码结构如此之多,以至于回复不切实际.这里给出的公认答案很简单,直截了当工作.
我在 Win 7 x64 机器上使用 Python 2.7 和 PyQT 4.
I am using Python 2.7 and PyQT 4 on a Win 7 x64 machine.
我正在尝试清除窗口中的一个小部件、一个接受"按钮、查看代码并将其替换为进度条.
I am trying to clear my window of one widget, an 'Accept' button, see code, and replace it with a progress bar.
即使我关闭了接受"按钮 &在进入处理循环之前添加进度条.窗口仅在循环完成后更新进度条直接跳到 100%.
Even though I close the 'Accept' button & add the progress bar before the processing loop is entered into. The window is only updated after the loop has finished & the progress bar jumps straight to 100%.
我的代码,
from PyQt4 import QtCore, QtGui
import sys
import time
class CentralWidget(QtGui.QWidget):
def __init__(self, parent=None):
super(CentralWidget, self).__init__(parent)
# set layouts
self.layout = QtGui.QVBoxLayout(self)
# Poly names
self.pNames = QtGui.QLabel("Import file name", self)
self.polyNameInput = QtGui.QLineEdit(self)
# Polytype selection
self.polyTypeName = QtGui.QLabel("Particle type", self)
polyType = QtGui.QComboBox(self)
polyType.addItem("")
polyType.addItem("Random polyhedra")
polyType.addItem("Spheres")
polyType.addItem("Waterman polyhedra")
polyType.activated[str].connect(self.onActivated)
# Place widgets in layout
self.layout.addWidget(self.pNames)
self.layout.addWidget(self.polyNameInput)
self.layout.addWidget(self.polyTypeName)
self.layout.addWidget(polyType)
self.layout.addStretch()
# Combobox choice
def onActivated(self, text):
if text=="Random polyhedra":
self.randomPolyhedra(text)
if text=="Spheres": # not implementaed yet
self.polyTypeName.setText("Not implemented yet.")
self.polyTypeName.adjustSize()
if text=="Waterman polyhedra": # not implementaed yet
self.polyTypeName.setText("Not implemented yet.")
self.polyTypeName.adjustSize()
# New options for random polyhedra choice
def randomPolyhedra(self, text):
self.polyNumberLbl = QtGui.QLabel("How many: ", self)
self.polyNumber = QtGui.QLineEdit(self)
self.acceptSeed = QtGui.QPushButton('Accept') # Accept button created
self.acceptSeed.clicked.connect(lambda: self.ranPolyGen())
self.layout.addWidget(self.polyNumberLbl)
self.layout.addWidget(self.polyNumber)
self.layout.addWidget(self.acceptSeed) # Accept button in layout
self.randFlag = True
self.polyTypeName.setText(text)
self.polyTypeName.adjustSize()
# Act on option choices for random polyhedra
def ranPolyGen(self):
polyCount = int(self.polyNumber.text())
self.progressBar = QtGui.QProgressBar() # Progress bar created
self.progressBar.setMinimum(1)
self.progressBar.setMaximum(polyCount)
self.acceptSeed.close() # Accept button closed
self.layout.addWidget(self.progressBar) # Add progressbar to layout
for poly in range(1, polyCount+1):
time.sleep(1) # Calls to main polyhedral generating code go here
print poly
self.progressBar.setValue(poly)
self.doneLbl = QtGui.QLabel("Done", self)
self.layout.addWidget(self.doneLbl)
# Creates GUI
class Polyhedra(QtGui.QMainWindow):
def __init__(self):
super(Polyhedra, self).__init__()
# Place central widget in layout
self.central_widget = CentralWidget(self)
self.setCentralWidget(self.central_widget)
# Set up window
self.setGeometry(500, 500, 300, 300)
self.setWindowTitle('Pyticle')
self.show()
# Combo box
def onActivated(self, text):
self.central_widget.onActivated(text)
def main():
app = QtGui.QApplication(sys.argv)
poly = Polyhedra()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
下面是循环执行期间的图片&完成后.
Below is a picture of during loop execution & after completion.
我不认为我了解 addWidget() 方法.我的印象是这会为当前布局添加另一个小部件(此处为 vbox 布局)&.close() 方法在指示时删除了一个小部件.
I dont think I have got my head around the addWidget() method. I was under the impression that this would add another widget to the present layout (a vbox layout here) & that the .close() method removed a widget when directed to do so.
我错过了什么?
推荐答案
您可以添加:
from PyQt4.QtGui import QApplication
然后在你的 for 循环中:
Then in your for loop:
QApplication.processEvents()
您的应用实际上变得没有响应,您需要调用 processEvents()
来处理事件并重新绘制 gui.我对 pyqt 并不太熟悉,但我想另一种选择是使用线程.
Your app is actually becoming unresponsive, you need to call processEvents()
to process the events and redraw the gui. I am not overly familiar with pyqt but I imagine another alternative is using a thread.
这篇关于PyQt 进度条直到 100% 才更新或出现的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!