Ayuda con barra de progreso en Python

Arnau Sanchez arnau en ehas.org
Mar Feb 6 23:38:18 CET 2007


Jacob Nuñez Garcia escribió:

>   Bien, mi problema es que estoy creando un programa en Python y
>   necesito copiar un archivo y necesito mostrar su progreso, esto usando
>   Python y GTK osea PyGTK pero desde hace una semana que estoy
>   trabajando en esto y no lo he conseguido aun, este es el código de mi
>   programa, para que vean mas o menos como están las cosas.
> 

>   Mi script si funciona pero no como deberia, al principio no crea la
>   ventana solo copia el archivo, despues sale la ventana y la progress
>   pero solo me muestra el porcentaje ya completo y no es asi como quiero
>   que funcione sino que salga la ventana y vaya avanzando la barra de
>   progreso mientras

Es una aplicación muy típica, tienes una entrada que te explica cómo hacerlo en 
el FAQ oficioso de PyGTK:

http://www.async.com.br/faq/pygtk/index.py?req=show&file=faq20.006.htp

En cuanto a tu código, no puedo evitar hacerte unos apuntes, siempre en el tono 
constructivo que anima esta lista :-)

- Los comentarios que pones son, en general, innecesarios. Sólo deberías 
explicar aquellas partes realmente complejas, en las que creas que no queda 
claro qué estás haciendo (para otro programador o para ti mismo en el futuro). 
Por norma general, el código debería ser lo suficientemente expresivo, mucho más 
en Python, donde tenemos la claridad por un tótem sagrado; comentar cosas 
evidentes sólo dificulta la legibilidad. Esto no incluye, por supuesto, el texto 
que sigue a la definición de funciones y clases, que además permite generar 
documentación de forma automática.

- Usas "self" de forma incorrecta. Excepto las variables que pertenecen a la 
instancia y deben quedar en memoria para su uso posterior, todas las demás 
deberían ser locales (sin el self). Hay muchísimas razones para ello: velocidad, 
ahorro de memoria, legibilidad...

- No entiendo esta línea:

if(True): #Mientras sea verdad lo anterior hacer

- ¿Realmente necesitas el "from __future__ import division"? quedaría más claro 
que pasaras dividendo o divisor a float y listo.

- Los booleanos forman parte de Python desde la versión 2.3, así que el uso de 
gtk.FALSE/gtk.TRUE está desaconsejado. Usa False/True.

- Dale alguna vuelta al bucle que empieza por "for i in 
range(0,self.size,8192):", hay mejores formas de hacerlo. Puedes jugar, por 
ejemplo, con el típico bucle en Python:

while 1:
    data = fd1.read(8192)
    if not data: break
    fd2.write(data)

un saludo
arnau




Más información sobre la lista de distribución Python-es