[PyQt] processEvents on QlistWidget operations does nothing

P. Mathé pmathe at neuf.fr
Thu Jan 24 13:14:49 GMT 2008


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.minimumSizeHint()))

        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)



More information about the PyQt mailing list