[PyQt] processEvents on QlistWidget operations does nothing

Phil Thompson phil at riverbankcomputing.com
Fri Jan 25 10:07:33 GMT 2008


On Thursday 24 January 2008, P. Mathé wrote:
> The program listed below downloads the broadcast schedule of a radio
> station for the cureent day and the three following. For each date , it
> reads an url, updates the progressBar and prints out in a QListWidget the
> date corresponding to the url just downloaded.
>
> When I run this program, the progressBar is updated as soon as each page is
> received, but the rows added into the QListWidget are displayed, all at the
> same time, only when all the pages are received, i.e. when the loop "for
> jour in jours" ends.
>
> (in the program listed below the lines commented out "" and/or "" change
> nothing if uncommented).
>
> #!/usr/bin/env python
> # -*- coding: utf-8 -*-
>
> from PyQt4.QtCore import *
> from PyQt4.QtGui import *
>
> from mx.DateTime import *
> import urllib
>
> class radioUi(object):
>     def setupUi(self, radioUi):
>         radioUi.setObjectName("radioUi")
>        
> radioUi.resize(QSize(QRect(0,0,268,352).size()).expandedTo(radioUi.minimumS
>izeHint()))
>
>         self.log = QListWidget(radioUi)
>         self.log.setGeometry(QRect(10,80,248,261))
>         self.log.setObjectName("log")
>
>         self.btnGo = QPushButton(radioUi)
>         self.btnGo.setGeometry(QRect(160,20,80,26))
>         self.btnGo.setObjectName("pushButton")
>         self.btnGo.setText(u"start")
>
>         self.progressBar = QProgressBar(radioUi)
>         self.progressBar.setGeometry(QRect(10,50,241,23))
>         self.progressBar.setProperty("value",QVariant(24))
>
> class radioProgDialog(QDialog, radioUi):
>     def __init__(self):
>         QDialog.__init__(self)
>         # Set up the user interface
>         self.setupUi(self)
>         self.connect(self.btnGo,SIGNAL("clicked()"),self.extraire)
>         #
>
>     def extraire(self):
>         url='http://www.radiofrance.fr/francevivace/prog/index.php?time=%u'
>         #
>         jours=[(int((now() + (j * oneDay)).ticks())) for j in range(0, 4)]
>         self.progressBar.setMaximum(len(jours))
>         self.progressBar.setValue(0)
>         print 'maxi', self.progressBar.maximum()
>         for jour in jours:
>                 print self.log.updatesEnabled()
>                 next_url=url % jour
>                 p=urllib.urlopen(next_url).read()
>                 #self.pagesEmissions.append(p)
>                 d=DateFromTicks(jour)
>                 logText=u'téléchargement %02d/%02d/%d' %
> (d.day,d.month,d.year) self.log.addItem(logText)
>                 self.progressBar.setValue(self.progressBar.value() + 1)
>                 print 'value', self.progressBar.value()
>                 #self.log.update()
>                 #self.log.repaint()
>                 QCoreApplication.processEvents(QEventLoop.AllEvents)
>                 print logText
>         print 'fini Vivace'
>
> if __name__ == "__main__":
>     import sys
>     app = QApplication(sys.argv)
>     radioProg = radioProgDialog()
>     radioProg.show()
>     sys.exit(app.exec_())
>
> Version Numbers Used
> Python 2.5.1
> Qt 4.3.2
> PyQt 4.3.1
> sip 4.7
> QScintilla 2.1
> Eric4 4.0.3 (r1529)

I think this is related to the comment in the docs for processEvents() about 
some widgets not working properly in this circumstance.

A better design would be to put the read in a separate thread and update the 
GUI by sending a custom event.

Phil



More information about the PyQt mailing list