PyQt 进度条直到 100% 才更新或出现 [英] PyQt progress bar not updating or appearing until 100%

查看:31
本文介绍了PyQt 进度条直到 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆