2009-04-17 9 views
1

J'essaie de coder quelque chose qui télécharge un fichier à partir d'un serveur Web et l'enregistre, montrant la progression du téléchargement dans un QProgressBar. Maintenant, il y a des façons de le faire en Python normal et c'est facile. Le problème est qu'il verrouille l'actualisation de la barre de progression. La solution consiste à utiliser la classe QNetworkManager de PyQT. Je peux très bien télécharger des choses, je ne peux pas obtenir la configuration pour montrer les progrès sur la barre de progression. Here's un exemple:pyQT QNetworkManager et ProgressBars

class Form(QDialog): 

    def __init__(self,parent=None): 
     super(Form,self).__init__(parent) 
     self.progressBar = QProgressBar() 
     self.reply = None 
     layout = QHBoxLayout() 
     layout.addWidget(self.progressBar) 
     self.setLayout(layout) 
     self.manager = QNetworkAccessManager(self) 
     self.connect(self.manager,SIGNAL("finished(QNetworkReply*)"),self.replyFinished) 
     self.Down() 

    def Down(self): 

     address = QUrl("http://stackoverflow.com") #URL from the remote file. 
     self.manager.get(QNetworkRequest(address)) 
    def replyFinished(self, reply): 
     self.connect(reply,SIGNAL("downloadProgress(int,int)"),self.progressBar, SLOT("setValue(int)")) 
     self.reply = reply 
     self.progressBar.setMaximum(reply.size()) 
     alltext = self.reply.readAll() 
     #print alltext 
     #print alltext 
    def updateBar(self, read,total): 
     print "read", read 
     print "total",total 
     #self.progressBar.setMinimum(0) 
     #self.progressBar.setMask(total) 
     #self.progressBar.setValue(read) 

Dans ce cas, ma méthode "updateBar" n'est jamais appelé ... des idées?

Répondre

4

Eh bien, vous n'avez connecté aucun des signaux à votre méthode updateBar().

changement

def replyFinished(self, reply): 
     self.connect(reply,SIGNAL("downloadProgress(int,int)"),self.progressBar, SLOT("setValue(int)")) 

à

def replyFinished(self, reply): 
     self.connect(reply,SIGNAL("downloadProgress(int,int)"),self.updateBar) 

Notez que dans Python vous ne devez pas utiliser explicitement la syntaxe SLOT(); vous pouvez simplement passer la référence à votre méthode ou fonction.

Mise à jour:

Je voulais juste signaler que si vous voulez utiliser une barre de progression dans tous les cas où vos serrures GUI au cours du traitement, une solution consiste à exécuter votre code de traitement dans un autre thread que votre interface graphique reçoit des événements de repeints. Pensez à lire sur la classe QThread, au cas où vous rencontreriez une autre raison pour une barre de progression qui n'a pas de solution prédéfinie pour vous.

Questions connexes