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?
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
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. –