Capítulo 6. El Control de Botón

Tabla de contenidos

6.1. Botones Normales
6.2. Botones Biestado (Toggle Buttons)
6.3. Botones de Activación (Check Buttons)
6.4. Botones de Exclusión Mútua (Radio Buttons)

6.1. Botones Normales

Ya hemos visto casi todo lo que hay que ver sobre el control de botón. Es bastante sencillo. Se puede usar la función gtk.Button() para crear un botón con una etiqueta pasándole un parámetro de cadena, o uno en blanco si no se especifica dicha cadena. Después depende uno el empaquetar objetos tales como una etiqueta o un pixmap en este nuevo botón. Para ello, se crea una nueva caja, y después se colocan los objetos en ella usando el típico pack_start(). Finalmente se usa add() para colocar la caja dentro del botón.

La función para crear un botón es:

  button = gtk.Button(label=None, stock=None)

si se especifica una etiqueta ésta se usa como texto del botón.Si se especifica stock éste se usa para elegir un icono de serie y una etiqueta para el botón. Los elementos de serie son:

  STOCK_DIALOG_INFO
  STOCK_DIALOG_WARNING
  STOCK_DIALOG_ERROR
  STOCK_DIALOG_QUESTION
  STOCK_DND
  STOCK_DND_MULTIPLE
  STOCK_ADD
  STOCK_APPLY
  STOCK_BOLD
  STOCK_CANCEL
  STOCK_CDROM
  STOCK_CLEAR
  STOCK_CLOSE
  STOCK_CONVERT
  STOCK_COPY
  STOCK_CUT
  STOCK_DELETE
  STOCK_EXECUTE
  STOCK_FIND
  STOCK_FIND_AND_REPLACE
  STOCK_FLOPPY
  STOCK_GOTO_BOTTOM
  STOCK_GOTO_FIRST
  STOCK_GOTO_LAST
  STOCK_GOTO_TOP
  STOCK_GO_BACK
  STOCK_GO_DOWN
  STOCK_GO_FORWARD
  STOCK_GO_UP
  STOCK_HELP
  STOCK_HOME
  STOCK_INDEX
  STOCK_ITALIC
  STOCK_JUMP_TO
  STOCK_JUSTIFY_CENTER
  STOCK_JUSTIFY_FILL
  STOCK_JUSTIFY_LEFT
  STOCK_JUSTIFY_RIGHT
  STOCK_MISSING_IMAGE
  STOCK_NEW
  STOCK_NO
  STOCK_OK
  STOCK_OPEN
  STOCK_PASTE
  STOCK_PREFERENCES
  STOCK_PRINT
  STOCK_PRINT_PREVIEW
  STOCK_PROPERTIES
  STOCK_QUIT
  STOCK_REDO
  STOCK_REFRESH
  STOCK_REMOVE
  STOCK_REVERT_TO_SAVED
  STOCK_SAVE
  STOCK_SAVE_AS
  STOCK_SELECT_COLOR
  STOCK_SELECT_FONT
  STOCK_SORT_ASCENDING
  STOCK_SORT_DESCENDING
  STOCK_SPELL_CHECK
  STOCK_STOP
  STOCK_STRIKETHROUGH
  STOCK_UNDELETE
  STOCK_UNDERLINE
  STOCK_UNDO
  STOCK_YES
  STOCK_ZOOM_100
  STOCK_ZOOM_FIT
  STOCK_ZOOM_IN
  STOCK_ZOOM_OUT

El programa de ejemplo buttons.py proporciona un ejemplo del uso de gtk.Button() para crear un botón con una imagen y una etiqueta en él. Se ha separado el código para crear una caja del resto para que se pueda usar en más programas. Hay más ejemplos del uso de imágenes más adelante en el tutorial. La figura Figura 6.1, “Botón con Pixmap y Etiqueta” muestra la ventana con un botón que incluye una imagen y una etiqueta:

Figura 6.1. Botón con Pixmap y Etiqueta

Botón con Pixmap y Etiqueta

El código fuente del programa buttons.py es:

    1   #!/usr/bin/env python
    2
    3   # ejemplo de inicialización de botones buttons.py
    4
    5   import pygtk
    6   pygtk.require('2.0')
    7   import gtk
    8
    9   # Creamos una nueva hbox con una imagen y una etiqueta empaquetadas en ella
   10   # y devolvemos la caja.
   11
   12   def xpm_label_box(parent, xpm_filename, label_text):
   13       # Crear caja para xpm y etiqueta
   14       box1 = gtk.HBox(gtk.FALSE, 0)
   15       box1.set_border_width(2)
   16
   17       # Ahora nos ponemos con la imagen
   18       image = gtk.Image()
   19       image.set_from_file(xpm_filename)
   20
   21       # Creamos una etiqueta para el botón
   22       label = gtk.Label(label_text)
   23
   24       # Empaquetamos el pixmap y la etiqueta en la caja
   25       box1.pack_start(image, gtk.FALSE, gtk.FALSE, 3)
   26       box1.pack_start(label, gtk.FALSE, gtk.FALSE, 3)
   27
   28       image.show()
   29       label.show()
   30       return box1
   31
   32   class Buttons:
   33       # Nuestro método habitual de retrollamada (callback)
   34       def callback(self, widget, data=None):
   35           print "Hello again - %s was pressed" % data
   36
   37       def __init__(self):
   38           # Creamos una ventana nueva
   39           self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
   40
   41           self.window.set_title("Image'd Buttons!")
   42
   43           # Es buena idea hacer esto para todas las ventanas
   44           self.window.connect("destroy", lambda wid: gtk.main_quit())
   45           self.window.connect("delete_event", lambda a1,a2:gtk.main_quit())
   46
   47           # Fijamos el ancho de borde de la ventana
   48           self.window.set_border_width(10)
   49
   50           # Creamos un nuevo botón
   51           button = gtk.Button()
   52
   53           # Conectamos la señal "clicked" a nuestra retrollamada
   54           button.connect("clicked", self.callback, "cool button")
   55
   56           # Esto llama a nuestra función de creación de caja
   57           box1 = xpm_label_box(self.window, "info.xpm", "cool button")
   58
   59           # Empaquetamos y mostramos todos los controles
   60           button.add(box1)
   61
   62           box1.show()
   63           button.show()
   64
   65           self.window.add(button)
   66           self.window.show()
   67
   68   def main():
   69       gtk.main()
   70       return 0
   71
   72   if __name__ == "__main__":
   73       Buttons()
   74       main()

Las líneas 12-34 definen la función auxiliar xpm_label_box() que crea una caja horizontal con un borde de ancho 2 (lineas 14-15) y le pone una imagen (lineas 22-23) y una etiqueta (linea 26).

Las líneas 36-70 definen la clase Buttons. Las líneas 41-70 definen el método de inicialización de instancia que crea una ventana (linea 43), le pone el título (linea 45), le conecta las señales "delete_event" y "destroy" (lineas 48-49). La linea 55 crea el botón sin etiqueta. Su señal "clicked" se conecta al método callback() en la linea 58. La función xpm_label_box() se llama en la linea 61 para crear la imagen y la etiqueta que se pondrán en el botón en la linea 64.

La función xpm_label_box() podría usarse para empaquetar archivos xpm y etiquetas en cualquier control que pueda ser un contenedor.

El control Botón tiene las siguientes señales:

      pressed - se emite cuando el botón del puntero se presiona en el control Botón

      released - se emite cuando el botón del puntero se suelta en el control Botón

      clicked - se emite cuando el botón del puntero se presiona y luego se
suelta sobre el control Botón

      enter - se emite cuando el puntero entra en el control Botón

      leave - se emite cuando el puntero sale del control Botón