如何在Python中制作带有进度条的下载?

3
我正在尝试使用这个包http://code.google.com/p/python-progressbar/来下载文件,例如下面的代码所示:
    def dlProgress(count, blockSize, totalSize):
        widgets = ['Test: ', Percentage(), ' ', Bar(marker=RotatingMarker()), ' ', ETA(), ' ', FileTransferSpeed()]
        pbar = ProgressBar(widgets=widgets, maxval=totalSize).start()
        for count in range(totalSize):
            #print count
            pbar.update(int(count*blockSize*100/totalSize))
        pbar.finish()            
    urllib.urlretrieve(url, fileName, reporthook=dlProgress)

问题在于,在真正的下载进度完成之前,进度条就已经达到了100%,然后它继续开始新的进度条,就像这样:
Test: 100% |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| Time: 0:00:31 402.06 kB/s
Test: 100% |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| Time: 0:00:31 408.39 kB/s
Test: 100% |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| Time: 0:00:32 389.47 kB/s
1个回答

5

在进度回调之外初始化进度条。然后在第一次回调时,检查并设置maxval,并启动它:

widgets = ['Test: ', Percentage(), ' ', Bar(marker=RotatingMarker()), ' ', ETA(), ' ', FileTransferSpeed()]
pbar = ProgressBar(widgets=widgets)

def dlProgress(count, blockSize, totalSize):
    if pbar.maxval is None:
        pbar.maxval = totalSize
        pbar.start()

    pbar.update(min(count*blockSize, totalSize))

urllib.urlretrieve(url, fileName, reporthook=dlProgress)
pbar.finish()

作为一则边角注释,最后一个区块不会是完整的区块,所以你需要确保你不会超过总大小。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接