2016-08-07 15 views
0

Ich mache ein Spiel mit Panda3D, und ich mache gerade einen Downloader, um das neueste Update herunterzuladen. Wenn Sie nicht wissen, was Panda3D ist, stellen Sie sich einfach die GUI vor, über die ich als Tkinter-Fenster spreche: P. Die Funktionen, die ich verwende sind:urllib.urlretrieve lässt GUI-Fenster nicht reagieren

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 

Dies jedoch das GUI-Fenster reagiert nicht, aber das Konsolenfenster ist in Ordnung. Wenn es nicht reagiert, werden die Benutzer denken, dass es blockiert ist und den Prozess beendet, und ihre Spieldaten werden beschädigt. Ich habe versucht, auf separaten Threads, wie folgt zu laufen:

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 

Aber das ist nicht einmal herunterladen. Gibt es eine Möglichkeit, eine Datei herunterzuladen, ohne dass ein Fenster (zB Tkinter-Fenster) nicht mehr reagiert?

Antwort

0

Sie sind auf dem richtigen Weg, wenn Sie einen separaten Thread für I/O verwenden. Es funktioniert wahrscheinlich nicht, weil Sie die Benutzeroberfläche vom Hauptthread aktualisieren müssen. Versuchen Sie, report() zu ändern, um diese Information in einer Struktur zu speichern, die später von dem UI-Thread überprüft werden kann.

+0

Es wird nicht heruntergeladen, wenn auf einem separaten Thread. Ich habe versucht, 'print (progress)' in die Reportfunktion einzufügen, und es wurde nicht einmal gedruckt. Ganz zu schweigen davon, dass die Datei nicht einmal heruntergeladen wurde, weil ich sie auch nach dem Start des Download-Vorgangs nicht in dem Ordner sehen konnte, in dem ich sie ausführte. – Developre

+0

Wenn ich Ihr zweites Snippet in einem Interpreter ausführen und doDownload() aufrufen, wird es ausgeführt und heruntergeladen. Entschuldigung, ich weiß nicht viel über deine Umgebung. Vielleicht hilft ein vollständiges ausführbares Beispiel, das Ihr Threading-Problem hervorruft, einige Antworten zu erhalten. –