python - PyQt progress bar not updating or appearing until 100% -
edit: there number of similar posts on pyqt4 progress bars not updating. focus on issue of threads & program updates window. although helpful, code structured replies not practical. accepted answer given here simple, point & works.
i using python 2.7 , pyqt 4 on win 7 x64 machine.
i trying clear window of 1 widget, 'accept' button, see code, , replace progress bar.
even though close 'accept' button & add progress bar before processing loop entered into. window updated after loop has finished & progress bar jumps straight 100%.
my code,
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 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 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 layout poly in range(1, polycount+1): time.sleep(1) # calls 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 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 picture of during loop execution & after completion.
i dont think have got head around addwidget() method. under impression add widget present layout (a vbox layout here) & .close() method removed widget when directed so.
what missing?
you can add:
from pyqt4.qtgui import qapplication
then in loop:
qapplication.processevents()
your app becoming unresponsive, need call processevents()
process events , redraw gui. not overly familiar pyqt imagine alternative using thread.
Comments
Post a Comment