[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