En la versión 2.0 de GTK+, el sistema de señales se ha movido de GTK a GLib. No entraremos en detalles sobre las extensiones que GLib 2.0 tiene en relación con el sistema de señales de GTK 1.2. Las diferecias no deberían notarse entre los usuarios de PyGTK.
Antes de que entremos en detalle en helloworld.py, discutiremos las señales y las retrollamadas. GTK es una libreria orientada a eventos, lo que significa que se dormirá en la función gtk.main() hasta que un evento ocurra y el control pase a la función apropiada.
Esta delegación del control se realiza usando la idea de "señales". (Nótese que estas señales no son las mismas que las señales de los sistemas Unix, y no se implementan usando estas, aunque la terminología es casi idéntica) Cuando un evento ocurre, como cuando presionamos un botón del ratón, la señal apropiada será "emitida" por el el control que fué presionado. Asi es cómo GTK hace la mayoría de su trabajo útil. Hay señales que todos los controles heredan, como "destroy", y hay señales que son específicas a cada control, como "toggled" en un botón de activación.
Para hacer que un botón realice una acción, tenemos que configurar un manejador de señales que capture estas señales y llame a la función apropiada. Esto se hace usando un método de GtkWidget (heredado de la clase GObject) como por ejemplo:
handler_id = object.connect(name, func, func_data) |
donde object es la instancia de GtkWidget que estará emitiendo la señal, y el primer argumento name es una cadena que contiene el nombre de la señal que deseas capturar. El segundo argumento, func, es la función que quieres que sea llamada cuando es capturado, y el tercer argumento, func_data, los datos que quieres pasar a esta función. El método devuelve un handler_id que puede usarse para desconectar o bloquear el manejador.
La función especificada en el tercer argumento se llama "función de retrollamada", y generalmente es de la forma:
def callback_func(widget, callback_data): |
donde el primer argumento será una referencia al widget (control) que emitió la señal, y el segundo (callback_data) una referencia a los datos dados como último argumento en el método connect() mostrado antes.
Si la función de retrollamada es un método de un objeto entonces tendrá la forma general siguiente:
def callback_meth(self, widget, callback_data): |
donde self es la instancia del objeto que invoca este método. Esta es la forma usada en el programa de ejemplo helloworld.py.
La forma anterior de declaración de una función de retrollamada a señales es sólo una guía general, ya que señales específicas de controles generan diferentes parámetros de llamada.
Otra llamada que se usa en el ejemplo helloworld.py es:
handler_id = object.connect_object(name, func, slot_object) |
connect_object() es lo mismo que connect() excepto que una función de retrollamada sólo usa un argumento y un método de retrollamada, dos argumentos:
def callback_func(object) def callback_meth(self, object) |
donde object normalmente es un control. connect_object() permite usar los métodos de controles PyGTK qué solo admiten un argumento (self) como manejadores de señales.