首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyQt进度条直到100%才会更新或出现

PyQt进度条直到100%才会更新或出现
EN

Stack Overflow用户
提问于 2015-06-13 21:46:29
回答 1查看 11.2K关注 0票数 10

编辑:在PyQt4进度栏上有许多类似的帖子没有更新。它们都关注线程问题&程序实际上是在哪里更新窗口的。虽然很有帮助,但我的代码结构非常复杂,所以答复不太实用。这里给出的被接受的答案是简单的,关键是工作。

我在Win 7 PyQT机器上使用Python2.7和x64 4。

我试图清除窗口中的一个小部件,一个“接受”按钮,查看代码,然后用一个进度条替换它。

即使我关闭了“接受”按钮&在进入处理循环之前添加进度条。该窗口只在循环完成后更新&进度条直接跳转到100%。

我的密码

代码语言:javascript
复制
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()方法删除了一个小部件。

我遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-13 21:59:25

你可以加上:

代码语言:javascript
复制
from PyQt4.QtGui import QApplication

然后在for循环中:

代码语言:javascript
复制
QApplication.processEvents() 

您的应用程序实际上正在变得没有响应,您需要调用processEvents()来处理事件并重新绘制gui。我对pyqt并不太熟悉,但我认为另一种选择是使用线程。

票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30823863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档