2

私はPythonが初めてで、いくつかのHTMLファイル/ URLのコンテンツを取得する際に問題があり、進行状況バーでステータスを表示します:

これは私が使用する関連コードです:

プログレスバー:

def createProgressbar(self):
        self.progressbarVar = StringVar()
        self.progressbar = ttk.Progressbar( self.masterWindow, variable=self.progressbarVar, length=400, maximum=100, mode='determinate' )
        self.progressbar.place(x=100, y=760)

        self.progressbarStatus = Label( self.masterWindow, text='Please wait ...', bg='#fafafa', fg='#333', bd=0 )
        self.progressbarStatus.place(x=100, y=730)

HTML を読む:

def readHTML(self):
        # Set new progressbar max, eg. 20 for 20 files to read
        self.progressbar.config(maximum=self.LinkListItemCount)

        # Progressbar Counter
        i=1

        # example for self.LinkListByCatDict
        # self.LinkListByCatDict = {'cat1': ['/test/asd.html', '/test/asd2.html'], 'cat2': ['/test/asd.html', '/test/asd2.html']}

        for item in self.LinkListByCatDict.items():
            actCategory = item[0]

            for linkItem in item[1]:
                url = 'http://www.example.com'+linkItem

                try:
                    req = urllib.request.Request( url )
                    open = urllib.request.urlopen( req )
                    requestContent = open.read()


                    if self.debug == True:
                        print('OK: '+url)
                except:
                    if self.debug == True:
                        print('Error: '+url)


                # Progressbar update
                self.progressbarVar.set(i)

                if self.debug == True:
                    print('Progressbar act: '+str(i))

                i += 1

通常は問題なく動作しますが、ループが処理されている間、インターフェイス全体にビーチボールしか表示されません (Mac OS)。ループの最後で、プログレスバーが 0 から直接 100% にジャンプします。

インターフェイスをハングアップせずに、それを行うより良い方法はありますか?

4

1 に答える 1

1

一度にデータを読み取らないでください。それはUIをブロックします。代わりに、少量のデータ (例: 8192/1024 バイト) をopen.read()、たとえばopen.read(1024). データを読み取った後、 app が Tk インスタンスであると仮定して、 を使用して UI を更新しapp.update()ます (コードのどこかで に変数を割り当てておく必要がありますTk())。これを while ループに入れて、read()関数が空のバイト文字列 ( b"") を返したときに while ルックを停止し、ダウンロードの完了を知らせます。プログレスバーが 0 から 100% にジャンプする理由がわからないので、コードを実行して調査します。

于 2013-10-19T15:30:32.923 に答える