次の行を使用してファイルをダウンロードする Tkinter GUI ウィンドウでファイル ダウンローダーを作成しようとしています。
urllib.urlretrieve(url = fileurl, filename = file, reporthook = progBar)
Progbar は、Tkinter GUI ウィンドウのプログレス バーです。Windows でコードを実行すると、ダウンロードは正常に機能し、進行状況バーと同様に正常に実行されます。
ただし、Mac で同じコードを実行すると、Tkinter GUI ウィンドウにアクティビティがある場合にのみ、ダウンロードと進行状況バーが進行します。たとえば、ウィンドウがバックグラウンドにある場合、ウィンドウがクリックされるまでダウンロードは一時停止します。それでも、Tkinter GUI ウィンドウがバックグラウンドにないときは、画面上でマウスを動かしたり、キーボードのボタンを繰り返し押したりするなどの操作を行っている場合にのみダウンロードが進行します。何らかの理由でタイムアウトしているようです。これを修正する方法や、Windows ではなく Mac でのみ発生する理由がわかりません。
progBar メソッドに print ステートメントを入れると、ダウンロードも遅くなります。
また、urllib.urlretrieve への呼び出しから reporthook 引数を削除しようとしました。これを行うと、ダウンロードは正常に進行します。
私のprogBarメソッドは次のとおりです。
def progBar(blocks, blocksize, totalsize) :
global pb
bytesdownloaded = blocksize*blocks
mbdownloaded = bytesdownloaded/1024/1024
mbsize = float(blocksize)/float(totalsize)
totalsize = totalsize/1024/1024
percent = mbsize*100
global v
va.set("(" + str(mbdownloaded) + 'MB out of ' + str(totalsize) + 'MB)')
pb.step(percent)
これが役立つ場合、私はPython 2.7を使用しています。
編集:詳細については、ダウンロード (urllib.urlretrieve への呼び出し) はバックグラウンド スレッドで実行されますが、GUI ウィンドウはメイン スレッドになります。これは問題と関係があるかもしれません。