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