2009-04-17 15 views
1

Webサーバーからファイルをダウンロードして保存し、QProgressBarにダウンロードの進行状況を示すコードを作成しようとしています。 これを通常のPythonで行う方法はありますが、簡単です。問題は、progressBarのリフレッシュをロックすることです。解決策は、PyQTのQNetworkManagerクラスを使用することです。私はそれでちょうど良いものをダウンロードすることができます、私はちょうどprogressBarの進捗状況を表示するためのセットアップを取得することはできません。 Here's例:この場合pyQT QNetworkManagerと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) 

は、私の方法 "updateBarは" ...任意のアイデアを呼ばれることはありませんか?

答えて

4

あなたはupdateBar()メソッドに信号を接続していません。 Pythonで明示的SLOT()構文を使用する必要がないこと

変更

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) 

に注意。メソッドまたは関数への参照を渡すことができます。

更新:

私はちょうどあなたがあなたのGUIは、処理中にロックアップどのような状況にプログレスバーを使用したい場合は、一つの解決策は、あなたのGUIので、別のスレッドであなたの処理コードを実行することであることを指摘したかったです再描画イベントを受け取ります。あらかじめ構築されたソリューションを持たないプログレスバーの別の理由がある場合に備えて、QThreadクラスについて読んでください。