编辑: PyQt4进度栏上有许多类似的帖子没有更新。 它们都集中在线程问题和程序实际更新窗口的位置。尽管很有帮助,但是我的代码结构如此之大,以至于答复都不切实际。就此而言,这里给出的公认答案很简单。
我在Win 7 x64机器上使用Python 2.7和PyQT 4。
我正在尝试清除一个窗口小部件,一个“接受”按钮的窗口,查看代码并将其替换为进度条。
即使我关闭了“接受”按钮并在进入处理循环之前添加进度条。仅在循环完成且进度条直接跳到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()
下面是循环执行期间和完成之后的图片。
我认为我对addWidget()方法一无所知。我的印象是,这将向当前布局(此处为vbox布局)添加另一个小部件,并且.close()方法在定向时将其删除。
我想念什么?
你可以加:
from PyQt4.QtGui import QApplication
然后在您的for循环中:
QApplication.processEvents()
您的应用实际上变得无响应,您需要调用 processEvents()以处理事件并重新绘制GUI。我对pyqt不太熟悉,但是我想另一个替代方法是使用线程。
processEvents()