6.4. Botones de Exclusión Mútua

Los botones de exclusión mútua son similares a los botones de activación excepto que se agrupan de tal forma que sólo uno puede estar seleccionado/pulsado en un momento dado. Esto es bueno para sitios en los que tu aplicación necesita seleccionar un valor de una pequeña lista de opciones.

Crear un nuevo botón de exclusión mútua se hace con la siguiente llamada:

  radio_button = gtk.RadioButton(group=None, label=None)

Te habrás dado cuenta del argumento adicional de esta llamada. Los botones de exclusión mútua requieren un grupo para funcionar correctamente.La primera llamada a gtk.RadioButton() debe pasarle None en el primer argumento y entonces se creará un nuevo grupo de botones de exclusión mútua con el nuevo botón de exclusión mútua como su único miembro.

Para añadir más botones de exclusión mútua a un grupo, pasa una referencia a un botón de exclusión mútua en el grupo en las llamadas posteriores a gtk.RadioButton().

Si se especifica un argumento label dicho texto se analizará para comprobar si contiene caracteres memotécnicos con prefijo '_'

También es una buena idea especificar explícitamente que botón será el que esté activado por defecto mediante:

  radio_button.set_active(is_active)

Esto se describe en la sección de los botones biestado, y funciona exactamente de la misma forma. Una vez que los botones de exclusión mútua se agrupan juntos, sólo uno del grupo puede estar activo al mismo tiempo. Si el usuario hace clic en un botón de exclusión mútua, y luego en otro, el primer botón de exclusión mútua emitirá una señal "toggled" (para informar de que va a estar activo), y luego el segundo botón emitirá su señal "toggled" (para informar de que va a estar activo).

El programa de ejemplo radiobuttons.py crea un grupo de botones de exclusión mútua con tres botones. La figura Figura 6.4. Ejemplo de Botones de Exclusión Mútua ilustra la ventana resultante:

Figura 6.4. Ejemplo de Botones de Exclusión Mútua

Ejemplo de Botones de Exclusión Mútua

The source code for the example program is:

    1   #!/usr/bin/env python
    2   
    3   # example radiobuttons.py
    4   
    5   import gtk
    6   
    7   class RadioButtons:
    8       def callback(self, widget, data=None):
    9           print "%s was toggled %s" % (data, ("OFF", "ON")[widget.get_active()])
   10   
   11       def close_application(self, widget, event, data=None):
   12           gtk.main_quit()
   13           return gtk.FALSE
   14   
   15       def __init__(self):
   16           self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
   17     
   18           self.window.connect("delete_event", self.close_application)
   19   
   20           self.window.set_title("radio buttons")
   21           self.window.set_border_width(0)
   22   
   23           box1 = gtk.VBox(gtk.FALSE, 0)
   24           self.window.add(box1)
   25           box1.show()
   26   
   27           box2 = gtk.VBox(gtk.FALSE, 10)
   28           box2.set_border_width(10)
   29           box1.pack_start(box2, gtk.TRUE, gtk.TRUE, 0)
   30           box2.show()
   31   
   32           button = gtk.RadioButton(None, "radio button1")
   33           button.connect("toggled", self.callback, "radio button 1")
   34           box2.pack_start(button, gtk.TRUE, gtk.TRUE, 0)
   35           button.show()
   36   
   37           button = gtk.RadioButton(button, "radio button2")
   38           button.connect("toggled", self.callback, "radio button 2")
   39           button.set_active(gtk.TRUE)
   40           box2.pack_start(button, gtk.TRUE, gtk.TRUE, 0)
   41           button.show()
   42   
   43           button = gtk.RadioButton(button, "radio button3")
   44           button.connect("toggled", self.callback, "radio button 3")
   45           box2.pack_start(button, gtk.TRUE, gtk.TRUE, 0)
   46           button.show()
   47   
   48           separator = gtk.HSeparator()
   49           box1.pack_start(separator, gtk.FALSE, gtk.TRUE, 0)
   50           separator.show()
   51   
   52           box2 = gtk.VBox(gtk.FALSE, 10)
   53           box2.set_border_width(10)
   54           box1.pack_start(box2, gtk.FALSE, gtk.TRUE, 0)
   55           box2.show()
   56   
   57           button = gtk.Button("close")
   58           button.connect_object("clicked", self.close_application, self.window,
   59                                 None)
   60           box2.pack_start(button, gtk.TRUE, gtk.TRUE, 0)
   61           button.set_flags(gtk.CAN_DEFAULT)
   62           button.grab_default()
   63           button.show()
   64           self.window.show()
   65   
   66   def main():
   67       gtk.main()
   68       return 0        
   69   
   70   if __name__ == "__main__":
   71       RadioButtons()
   72       main()

El código es bastante simple de seguir. Las lineas 61-62 hacen que el botón "close" sea el control por defecto para que al pulsar la tecla "Enter" cuando la ventana está activa el botón "close" emitirá la señal "clicked".