3.2. Un Hola Mundo Mejorado

    1   #!/usr/bin/env python
    2
    3   # Ejemplo helloworld2.py
    4
    5   import pygtk
    6   pygtk.require('2.0')
    7   import gtk
    8
    9   class HelloWorld2:
   10
   11       # La retrollamada mejorada. Los datos que se pasan a esta función
   12       # se imprimen por la salida estándar.
   13       def callback(self, widget, data):
   14           print "Hello again - %s was pressed" % data
   15
   16       # otra retrollamada
   17       def delete_event(self, widget, event, data=None):
   18           gtk.main_quit()
   19           return gtk.FALSE
   20
   21       def __init__(self):
   22           # Creamos una ventana
   23           self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
   24
   25           # Esta llamada establece el título de la
   26           # ventana como "Hello Buttons!"
   27           self.window.set_title("Hello Buttons!")
   28
   29           # Aquí establecemos un manejador para delete_event que
   30           # sale inmediatamente de GTK+.
   31           self.window.connect("delete_event", self.delete_event)
   32
   33           # Establece el grosor del borde de la ventana
   34           self.window.set_border_width(10)
   35
   36           # Creamos una caja en la que empaquetar los controles. Esto se describe detalladamente
   37           # en la sección de "empaquetado". La caja no es visible en realidad sino que simplemente
   38           # facilita la organización de los controles.
   39           self.box1 = gtk.HBox(gtk.FALSE, 0)
   40
   41           # Introducimos la caja en la ventana principal
   42           self.window.add(self.box1)
   43
   44           # Crea un nuevo botón con la etiqueta "Button 1".
   45           self.button1 = gtk.Button("Button 1")
   46
   47           # Ahora, cuando se pulsa el botón, llamamos al método "callback"
   48           # con un puntero a "button 1" como argumento
   49           self.button1.connect("clicked", self.callback, "button 1")
   50
   51           # En vez de usar add(), empaquetamos este botón en la caja visible
   52           # que ha sido introducida en la ventana.
   53           self.box1.pack_start(self.button1, gtk.TRUE, gtk.TRUE, 0)
   54
   55           # Hay que recordar siempre este paso, que indica a GTK+ que la preparación del
   56           # botón ha terminado y que ya es posible mostrarlo.
   57           self.button1.show()
   58
   59           # Seguimos los mismos pasos para crear el segundo botón
   60           self.button2 = gtk.Button("Button 2")
   61
   62           # Llamamos la misma retrollamada pero con un argumento diferente,
   63           # haciendo referencia a "button 2" esta vez.
   64           self.button2.connect("clicked", self.callback, "button 2")
   65
   66           self.box1.pack_start(self.button2, gtk.TRUE, gtk.TRUE, 0)
   67
   68           # El orden en que mostramos los botones no es muy importante, pero es recomendable
   69           # mostrar la ventana en último lugar, puesto que así aparece todo de una vez.
   70           self.button2.show()
   71           self.box1.show()
   72           self.window.show()
   73
   74   def main():
   75       gtk.main()
   76
   77   if __name__ == "__main__":
   78       hello = HelloWorld2()
   79       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

Ejemplo mejorado de Hola Mundo

Esta vez se puede ver que no hay forma fácil de salir del programa, y resulta necesario usar el gestor de ventanas o la línea de comandos para eliminarlo. Un buen ejercicio para el lector sería insertar un tercer botón "Salir" que cerrara el programa. Sería interesante jugar con las opciones de pack_start() al tiempo que se lee la siguiente sección, así como probar a cambiar de tamaño la ventana y observar qué sucede.

Como nota, hay que mencionar otra constante útil para gtk.Window() - WINDOW_DIALOG. Este tipo de ventana interactúa de forma distinta con el gestor de ventanas y debe usarse en ventanas de uso transitorio.

A continuación se describen en orden las pequeñas diferencias del código respecto a la versión inicial del programa "Hola Mundo":

Como ya se ha dicho, no existe manejador del evento "destroy" en esta versión mejorada de "Hola Mundo".

Las líneas 13-14 definen un método 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 línea 27 pone título a la barra de título de la ventana (véase la Figura 3.1, “Ejemplo mejorado de Hola Mundo”).

La línea 39 crea una caja horizontal (gtk.HBox) que almacena los dos botones que se crean en las líneas 45 y 60. La línea 42 añade la caja horizontal al contenedor de la ventana.

Las líneas 49 y 64 conectan el método callback() a la señal "clicked" de los botones. Y cada botón establece una cadena diferente que se pasa al método callback() al ser invocado.

Las líneas 53 y 66 empaquetan los botones en la caja horizontal. Y, finalmente, las líneas 57 y 70 indican a GTK+ que muestre los botones.

Las líneas 71-72 piden finalmente a GTK+ que muestre la caja y la ventana.