0

我正在尝试使用 Tkinter GUI 窗口制作文件下载器,它将使用以下行下载文件:

 urllib.urlretrieve(url = fileurl, filename = file, reporthook = progBar)

Progbar 是我的 Tkinter GUI 窗口上的进度条。当我在 Windows 上运行我的代码时,下载工作正常并且运行正常,进度条也是如此。

但是,当我在 Mac 上运行相同的代码时,只有在 Tkinter GUI 窗口中有活动时,下载和进度条才会继续。例如,如果窗口在后台,下载将暂停,直到单击该窗口。即使这样,当 Tkinter GUI 窗口不在后台时,只有当我在屏幕上移动鼠标或反复按下键盘上的按钮等操作时,下载才会进行,否则下载会再次暂停。似乎由于某种原因它超时了,我不知道如何解决这个问题或者为什么它只发生在 Mac 而不是 Windows 上。

如果我在 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 窗口是主线程。这可能与问题有关。

4

1 回答 1

0

这只是一个猜测,但报告钩子中的 UI 输出命令可能会挂起,因为事件循环(我猜)在程序处于后台时已暂停。我对 Tkinter UI 模型的记忆模糊,但一种解决方案可能是在钩子中设置一些全局变量与您当前的进度,并让 UI 单独绘制它 - 不要在钩子中发出 UI 命令。

于 2013-07-23T13:26:25.917 回答