[pyGTK] avance en un progressbar

Milton Galo Patricio Inostroza Aguilera minoztro en gmail.com
Lun Oct 27 17:31:01 CET 2008


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

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