¿Cómo hacer una descarga con la barra de progreso en Python?

Estoy intentando implementar este paquete http://code.google.com/p/python- barra de progreso/ al descargar un archivo como a continuación:

    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)

El problema es que la barra de progreso va al 100% antes de que finalice el proceso de descarga real, y continúa comenzando la nueva barra, como esta:

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
0

1 Respuestas

Debe inicializar su barra de progreso fuera de la devolución de llamada de progreso. Luego, la primera vez que se devuelve la llamada, verifique y configure el maxval y lo inicie:

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()

Como nota al margen, ese último bloque no será un bloque completo, por lo que querrás asegurarte de no sobrepasar el tamaño total.

0
agregado