sábado, 15 de marzo de 2014

Python. Conexión de señales( PyGtk )




Seguimos con nuestro particular estudio de Python y nuestro pequeño programa.

Hasta ahora, hemos visto como hacer uso de Glade, y vemos como conectamos las respectivas señales.

   #Create object gtk.Window , from load window the glade
   self.window = self.glade.get_object('consultas')
   # Example connect manual signal.
   self.window.connect("destroy", self.destroy)

Si le echamos un vistazo al commit 78f6437,podemos observamos los cambios que teníamos anteriormente, git diff 753f400 78f6437 , observaremos como podemos determinar en Glade donde tiene que saltar.

En la imagen de tinnydb.ui puedes ver donde tienes que declarar que señal 
vamos a controlar.


En este caso, vamos a controlar el evento delete-event
En Gtk, este evento se dispara ANTES del destroy, y por ejemplo, podemos usarlo para preguntar si queremos salir de la aplicación o no.
Eso se consigue simplemente deteniendo la propagación de la señal al sistema de eventos de GTK, o por el contrario dejamos a Gtk que siga su curso, en este caso, sería el salto a la señal destroy.

¿ Pero no habíamos conectado manualmente el destroy ? Cierto. Podemos conectarlo combinándolo glade, además, las señales que conectamos se suman a las existen no se eliminan, aunque yo jamás lo he realizado, la teoría es simple: Para un mismo evento de Gtk, se puede disparar una o varias señales.
( Un poco de teoría de Gtk tampoco viene mal ;-) )

Bueno, seguimos. ¿ Como le decimos que use las señales definidas en Glade ?

# From Glade, signal delete_event the window consultas,  at class Handler.
  self.glade.connect_signals( Handler() )
Ya está, muy simple. Esto lo que hace es que decirme que clase va a tratar los eventos.

Creamos la clase que quiero que procese las señales;

class Handler():
    def delete_event(self, widget,data=None):
        print( "Call from Glade." )
        # TIP:if you return 0 , destroy, but if you return 1, stop , not kill program
        # TODO: Here create dialog ask if I want exit program
        return 0

Esto lo he realizado a propósito para que veáis lo que podemos hacer.
Podía hacer realizado;
  self.glade.connect_signals( self )
Ahora es nuestra propia clase principal, lo que tendrá un método llamado delete_event que gestiona esa señal.

También se puede conectar señales de esta manera;

 #Create our dictionay and connect it
dic = { "delete_event" : self.delete_event,
 "destroy" : gtk.main_quit }
self.window.signal_autoconnect(dic)

Hasta aquí un poquito de PyGtk , Glade y sus señales.




No hay comentarios:

Publicar un comentario

Android y Git. Disponer del hash automáticamente.

Una de las cosas a las que estoy acostumbrado, es tener siempre en mi código, el hash/tag/versión del control de versiones que estoy usan...