[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