我正在使用Panda3D制作一款游戏,目前我正在制作一个下载程序来下载最新更新。如果你不知道Panda3D是什么,想象一下我所说的GUI是一个Tkinter窗口:P。我使用的功能是:
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窗口没有响应,但是控制台窗口是正常的。如果它没有响应,用户会认为它被卡住了,并结束其过程,他们的游戏数据也会被破坏。我试过在不同的线程上运行,比如:
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窗口(没有响应?
使用单独的线程进行I/O操作是正确的。它可能不起作用,因为您需要从主线程更新UI。尝试更改report()
以将该信息保存在稍后UI线程可以检查的结构中。