Está en la página 1de 3

Captulo 3.

Avanzando
Tabla de contenidos 3.1. Ms sobre manejadores de seales 3.2. Un Hola Mundo Mejorado

3.1. Ms sobre manejadores de seales


Veamos otra vez la llamada a connect() .
object.connect(name, func, func_data)

El valor de retorno de connect() es un nmero entero que identifica la retrollamada. Como ya se ha mencionado, es posible disponer de tantas retrollamadas por seal como sea necesario, y cada una de ellas se ejecutar por turnos, en el mismo orden de conexin. Este identificador permite eliminar la retrollamada de la lista de retrollamadas activas mediante el mtodo:
object.disconnect(id)

As, pasando el identificador devuelto por los mtodos de conexin, es posible desconectar un manejador de seal. Tambin es posible deshabilitar temporalmente un manejador de seal mediante los mtodos signal_handler_block() y signal_handler_unblock().
object.signal_handler_block(handler_id) object.signal_handler_unblock(handler_id)

3.2. Un Hola Mundo Mejorado


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #!/usr/bin/env python # Ejemplo helloworld2.py import pygtk pygtk.require('2.0') import gtk class HelloWorld2: # La retrollamada mejorada. Los datos que se pasan a esta funcin # se imprimen por la salida estndar. def callback(self, widget, data): print "Hello again - %s was pressed" % data # otra retrollamada def delete_event(self, widget, event, data=None): gtk.main_quit() return gtk.FALSE def __init__(self): # Creamos una ventana self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)

24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79

# Esta llamada establece el ttulo de la # ventana como "Hello Buttons!" self.window.set_title("Hello Buttons!") # Aqu establecemos un manejador para delete_event que # sale inmediatamente de GTK+. self.window.connect("delete_event", self.delete_event) # Establece el grosor del borde de la ventana self.window.set_border_width(10)

# Creamos una caja en la que empaquetar los controles. Esto se describe de # en la seccin de "empaquetado". La caja no es visible en realidad sino q # facilita la organizacin de los controles. self.box1 = gtk.HBox(gtk.FALSE, 0) # Introducimos la caja en la ventana principal self.window.add(self.box1) # Crea un nuevo botn con la etiqueta "Button 1". self.button1 = gtk.Button("Button 1") # Ahora, cuando se pulsa el botn, llamamos al mtodo "callback" # con un puntero a "button 1" como argumento self.button1.connect("clicked", self.callback, "button 1") # En vez de usar add(), empaquetamos este botn en la caja visible # que ha sido introducida en la ventana. self.box1.pack_start(self.button1, gtk.TRUE, gtk.TRUE, 0)

# Hay que recordar siempre este paso, que indica a GTK+ que la preparacin # botn ha terminado y que ya es posible mostrarlo. self.button1.show() # Seguimos los mismos pasos para crear el segundo botn self.button2 = gtk.Button("Button 2") # Llamamos la misma retrollamada pero con un argumento diferente, # haciendo referencia a "button 2" esta vez. self.button2.connect("clicked", self.callback, "button 2") self.box1.pack_start(self.button2, gtk.TRUE, gtk.TRUE, 0)

# El orden en que mostramos los botones no es muy importante, pero es reco # mostrar la ventana en ltimo lugar, puesto que as aparece todo de una v self.button2.show() self.box1.show() self.window.show() def main(): gtk.main() if __name__ == "__main__": hello = HelloWorld2() main()

Al ejecutar helloworld2.py se genera la ventana de la Figura 3.1, Ejemplo mejorado de Hola Mundo. Figura 3.1. Ejemplo mejorado de Hola Mundo

Esta vez se puede ver que no hay forma fcil de salir del programa, y resulta necesario usar el gestor de ventanas o la lnea de comandos para eliminarlo. Un buen ejercicio para el lector sera insertar un tercer botn "Salir" que cerrara el programa. Sera interesante jugar con las opciones de pack_start() al tiempo que se lee la siguiente seccin, as como probar a cambiar de tamao la ventana y observar qu sucede. Como nota, hay que mencionar otra constante til para gtk.Window() - WINDOW_DIALOG. Este tipo de ventana interacta de forma distinta con el gestor de ventanas y debe usarse en ventanas de uso transitorio. A continuacin se describen en orden las pequeas diferencias del cdigo respecto a la versin inicial del programa "Hola Mundo": Como ya se ha dicho, no existe manejador del evento "destroy" en esta versin mejorada de "Hola Mundo". Las lneas 13-14 definen un mtodo de retrollamada similar a la retrollamada hello() del ejemplo inicial. La diferencia reside en que ahora la retrollamada imprime un mensaje que incluye los datos que se le suministran. La lnea 27 pone ttulo a la barra de ttulo de la ventana (vase la Figura 3.1, Ejemplo mejorado de Hola Mundo). La lnea 39 crea una caja horizontal (gtk.HBox) que almacena los dos botones que se crean en las lneas 45 y 60. La lnea 42 aade la caja horizontal al contenedor de la ventana. Las lneas 49 y 64 conectan el mtodo callback() a la seal "clicked" de los botones. Y cada botn establece una cadena diferente que se pasa al mtodo callback() al ser invocado. Las lneas 53 y 66 empaquetan los botones en la caja horizontal. Y, finalmente, las lneas 57 y 70 indican a GTK+ que muestre los botones. Las lneas 71-72 piden finalmente a GTK+ que muestre la caja y la ventana.

También podría gustarte