2009-04-17 12 views
1

Ich versuche, etwas zu kodieren, das eine Datei von einem Webserver herunterlädt und speichert, den Download-Fortschritt in einer QProgressBar zeigend. Jetzt gibt es Möglichkeiten, dies in regulären Python zu tun, und es ist einfach. Problem ist, dass es die Aktualisierung der Fortschrittsbalken sperrt. Die Lösung besteht darin, die QNetworkManager-Klasse von PyQT zu verwenden. Ich kann Sachen einfach gut damit herunterladen, ich kann einfach nicht das Setup bekommen, um den Fortschritt auf der Fortschrittsbalken zu zeigen. Heres ein Beispiel:pyQT QNetworkManager und 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) 

In diesem Fall meine Methode "updateBar" wird nie irgendwelche Ideen genannt ...?

Antwort

4

Nun, Sie haben keines der Signale mit Ihrer updateBar() - Methode verbunden.

Änderung

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

zu

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

Beachten Sie, dass in Python Sie müssen den Schlitz() Syntax nicht explizit verwenden; Sie können einfach den Verweis auf Ihre Methode oder Funktion übergeben.

Update:

Ich wollte nur darauf hinweisen, dass, wenn Sie einen Fortschrittsbalken in jeder Situation verwendet werden soll während der Verarbeitung, wo Ihre GUI abstürzt, eine Lösung ist Ihr Verarbeitungscode in einem anderen Thread so Ihre GUI laufen empfängt Repaint-Ereignisse. Erwägen Sie, etwas über die QThread-Klasse zu lesen, falls Sie auf einen anderen Grund für einen Fortschrittsbalken stoßen, der keine vorgefertigte Lösung für Sie hat.