2016-08-07 2 views
0

私はPanda3Dを使用してゲームを作っています。私は現在最新のアップデートをダウンロードするダウンローダーを作っています。 Panda3Dが何であるかわからない場合は、私がTkinterウィンドウとして話しているGUIを想像してください:P。私が使用する関数は、以下のとおりです。urllib.urlretrieveはGUIウィンドウに反応しません

def doDownload(): 
    urllib.urlretrieve("http://hiddenfile/hi.txt", "hi.txt", reporthook=report) 

def report(count, blockSize, totalSize): 
    percent = int(count*blockSize*100/totalSize) 
    gui.downloadBar['value'] = percent 

しかし、これは、GUIウィンドウが応答しなくなり、まだコンソールウィンドウで結構です。それが応答しない場合、ユーザーはそれが固まってプロセスを終了し、それらのgamedataが破損すると考えられます。私はこのように別々のスレッドで実行しようとしました:

def doDownload(): 
    threading.Thread(target=__doDownload).start() 

def __doDownload(): 
    urllib.urlretrieve("http://hiddenfile/hi.txt", "hi.txt", reporthook=report) 

def report(count, blockSize, totalSize): 
    percent = int(count*blockSize*100/totalSize) 
    gui.downloadBar['value'] = percent 

しかし、それもダウンロードされません。ウィンドウ(例:Tkinterウィンドウ)が反応しなくても、ファイルをダウンロードする方法はありますか?

答えて

0

I/O用に別のスレッドを使用することで、正しい軌道に乗っています。メインスレッドからUIを更新する必要があるため、おそらく動作しません。 report()を変更して、その情報を後でUIスレッドで確認できる構造に保存してみてください。

+0

別のスレッドではダウンロードされません。私は 'print(progress)'をレポート関数に追加しようとしましたが、それは印刷されませんでした。たとえダウンロードプロセスが開始された後であっても、私がそれを実行していたフォルダで見ることができなかったので、ファイルをダウンロードしなかったことは言うまでもありません。 – Developre

+0

インタープリタで2番目のスニペットを実行してdoDownload()を呼び出すと、doDownload()が実行され、ダウンロードされます。申し訳ありませんが、あなたの環境についてよく分かりません。スレッドの問題を生成する完全な実行可能な例が、多少の答えを得るのに役立つでしょう。 –

関連する問題