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?

during loop execution & after.

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

Popular posts from this blog

c# - Validate object ID from GET to POST -

node.js - Custom Model Validator SailsJS -

php - Find a regex to take part of Email -