[pyGTK] avance en un progressbar
Milton Galo Patricio Inostroza Aguilera
minoztro en gmail.com
Mar Oct 28 02:45:30 CET 2008
El día 27 de octubre de 2008 13:31, Milton Galo Patricio Inostroza
Aguilera <minoztro en gmail.com> escribió:
> Estimados:
>
> Hoy estudiando los generadores me topé con el tema de las
> progressbar (es un tópico asociado)...entonces me puse manos a la obra
> para echar a andar una barra de progreso con un generador (cosa que no
> es muy dificil).
Buscando por internet encontré otra solución que al parecer también la
utiliza el modulo de update-manager...la funcion tarea y la
on_checkbuttonFibonacci_toggled son resumidas a:
def on_checkbuttonFibonacci_toggled(self, widget):
self.progressbarTarea.set_text("Leyendo Archivo %s")
for theLine in open("glade/windowTarea.glade"):
self.progressbarTarea.pulse()
for theWord in theLine.split():
for theElement in theWord:
for i in range(500):
print theElement
while gtk.events_pending():
gtk.main_iteration(False)
self.progressbarTarea.set_fraction(1)
self.progressbarTarea.set_text("Tarea completada 100%")
en donde si se dan cuenta se agrega el siguiente loop:
while gtk.events_pending():
gtk.main_iteration(False)
He ejecutado los códigos y al parecer tienen el mismo rendimiento y
sobrecarga de sistema...ahora cual es la diferencia conceptual entre
esta aproximación y la otra que utiliza gobject.idle_add?
>
> Todo va bien, muestro el codigo medular:
>
> def tarea(self):
> for i in range(10000):
> completado = self.progressbarTarea.get_fraction()
> self.progressbarTarea.set_fraction((completado + i)/10000)
> yield True
> self.progressbarTarea.set_text("Operacion terminada")
> yield False
>
> def on_checkbuttonFibonacci_toggled(self, widget):
> if widget.get_active():
> self.progressbarTarea.set_text("Algo de texto")
> mytarea = self.tarea()
> gobject.idle_add(mytarea.next)
>
> Bueno en el método tarea hago el trabajo que debo realizar (que en
> este caso no hago nada, solo actualizar el avance de la barra de
> progreso) y todo funciona correctamente. En el método
> on_checkbuttonFibonacci_toggled, cuando el widget está activo echo a
> correr mi tarea y aquí nace la primera pregunta...he leído de la
> documentación que gobject.idle_add sirve para ejecutar tareas cuando
> el main de gtk no tiene nada más que hacer ¿eso no lo resta prioridad
> a mi tarea?¿sólo basta con cambiar las prioridades que señalan en la
> documentación?.
>
> Ahora si se dan cuenta el set_fraction es para tareas en donde yo se
> cuanto tiempo se va a tardar mi procesador en realizar (o en cuantas
> iteraciones), por lo tanto todo anda bien cuando aumentamos el
> progreso de la barra....entonces me pregunte qué pasa cuando no sé
> cuanto me voy a demorar...ajá! la documentación recomienda utilizar
> pulse...entonces el código queda algo así:
>
> def tarea(self):
> for i in range(10000):
> time.sleep(0.05)
> self.progressbarTarea.pulse()
> yield True
> yield False
>
> def on_checkbuttonFibonacci_toggled(self, widget):
> if widget.get_active():
> self.progressbarTarea.set_text("some text")
> mytarea = self.tarea()
> gobject.idle_add(mytarea.next)
>
>
> Tuve que agregar un time.sleep(0.05) para que la barra no avanzara
> de forma tan rápida y claro de forma antinatural para el usuario...Acá
> viene mi segunda pregunta..¿No existe otra forma de que la barra
> avance de forma más suave?...ya que si se fijan por hacer algo
> "cosmetico" estoy retardando la ejecución de la tarea que
> verdaderamente importa...o será como no estoy haciendo nada de
> computo, luego cuando agregue funcionalidades mayores avanzará más
> lento?...alguien tiene experiencia en esto?
>
> Gracias por vuestra ayuda y comentarios.
>
> --
> Milton Inostroza Aguilera
>
--
Milton Inostroza Aguilera
------------ próxima parte ------------
_______________________________________________
Lista de correo Python-es
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes
Más información sobre la lista de distribución Python-es