Foros del Web » Programando para Internet » Python »

cambiar estado del puntero (pyGtk)

Estas en el tema de cambiar estado del puntero (pyGtk) en el foro de Python en Foros del Web. Buenas. tengo un cuadro de diálogo para que el usuario introduzca un archivo .ods y leer los datos de éste, para pasarlo a una base ...
  #1 (permalink)  
Antiguo 01/07/2013, 06:57
 
Fecha de Ingreso: abril-2007
Mensajes: 8
Antigüedad: 17 años, 7 meses
Puntos: 0
cambiar estado del puntero (pyGtk)

Buenas.

tengo un cuadro de diálogo para que el usuario introduzca un archivo .ods y leer los datos de éste, para pasarlo a una base de datos.

Utilizo una adaptación de la clase ODSReader de Marco Conti, http://www.marco83.com/work/wp-content/uploads/2011/11/odf-to-array.py, para leer la tabla.

Mi problema es que cuando le doy al botón aceptar, éste queda como pulsado, hasta que concluye la lectura, del archivo.

Me gustaría que al hacer click, se pusiera el cursor en modo espera (Watch) y al finalizar la tarea en modo normal, algo así:
Código Python:
Ver original
  1. def aceptar(self, widget):
  2.         self.cambiar_cursor (gtk.gdk.WATCH)
  3.         #self.widgets.queue_draw()
  4.         datos = self.leer_datos()
  5.  
  6.         self.cambiar_cursor(None)

He probado con este "cambiar_cursor", que he adaptado de un código que he encontrado en internet, ...
Código Python:
Ver original
  1. def cambiar_cursor (self, cursor):
  2.         gdk_win = gtk.gdk.Window(self.widgets.window,
  3.             gtk.gdk.screen_width(),
  4.             gtk.gdk.screen_height(),
  5.             gtk.gdk.WINDOW_CHILD,
  6.             0,
  7.             gtk.gdk.INPUT_ONLY)
  8.         if cursor:
  9.             gdk_cursor = gtk.gdk.Cursor(cursor)
  10.         else:
  11.             gdk_cursor = None
  12.         gdk_win.set_cursor(gdk_cursor)
  13.         gdk_win.show()


... PERO, el cursor se activa tras la lectura, el botón se mantiene pulsado durante bastante tiempo, he probado con queue_draw() -como aparece en el código: comentado-, pero tampoco.

Pienso que el problema está en la carga del archivo...
Código Python:
Ver original
  1. def leer_datos (self):
  2.         resultado = None
  3.         doc = ODSReader(self.filechooser.get_filename())
  4.         ...
... que es cuando se queda 'parada' la "gui"

Alguien sabe como hacer esto de forma más eficaz.

Gracias

Última edición por maestrodenada; 01/07/2013 a las 07:04
  #2 (permalink)  
Antiguo 01/07/2013, 09:46
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: cambiar estado del puntero (pyGtk)

Haz el proceso en un thread separado.

Lo que pasa es lo siguiente:
1. La GUI en todos los frameworks que conozco hasta ahora trabajan sobre un solo thread.
2. Si ejecutas un método, ese método corre sobre el mismo thread de la GUI y no es hasta que acaba la ejecución de tu método que el control regresa a la GUI. Por eso se queda como 'congelado'.
3. Para evitar lo anterior lo que comúnmente se hace es ejecutar un thread para que haga la tarea en paralelo y cuando termine le avise al programa.

Aquí hay ejemplo de como lograr lo que te comento.

http://stackoverflow.com/questions/8...unning-process
  #3 (permalink)  
Antiguo 02/07/2013, 18:04
 
Fecha de Ingreso: abril-2007
Mensajes: 8
Antigüedad: 17 años, 7 meses
Puntos: 0
Respuesta: cambiar estado del puntero (pyGtk)

Lo he intentado con los threads y no consigo solucionar el problema.

La función es una adaptación de chuwiki:

Código Python:
Ver original
  1. def aceptar(self, widget):
  2.         self.cambiar_cursor (gtk.gdk.WATCH)
  3.         try:
  4.             self.hilo_fin = False
  5.             t = threading.Thread (target = self.leer_datos, args = ())
  6.             t.start()
  7.             while not self.hilo_fin:
  8.                 pass
  9.             print " fin hilo"
  10.         finally:
  11.             self.cambiar_cursor(None)
... pues tampoco funciona.
He probado incluso desglosar el código en dos funciones y crear varias señales, ... pero tampoco...
En el tutorial de González Duque dice que los threads "dependen de la plataforma y puede ser necesario, aunque no es común, recompilar el intérprete". Utilizo Fedora (Linux)... probaré con otros ejemplos de threads a ver si funcionan correctamente.
Por otro lado, parece que donde se congela es en la creación del objeto ODSReader.

SALUD+os

Etiquetas: pygtk
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:54.