6.4. Botones de Exclusión Mútua (Radio Buttons)

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 aquellas situaciones en las que la aplicación necesita seleccionar un valor entre una pequeña lista de opciones.

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

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

Es necesario fijarse en el argumento adicional de esta llamada. Los botones de exclusión mútua requieren un grupo group 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 se pasa una referencia a un botón de exclusión mútua en group en las llamadas posteriores a gtk.RadioButton().

Si se especifica un argumento label dicho texto se analizará para comprobar la presencia de caracteres mnemotécnicos con prefijo '_'.

También es buena idea especificar explícitamente qué 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 manera. Una vez que los botones de exclusión mútua se agrupan, sólo uno de los pertenecientes al 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 inactivo), 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	# ejemplo radiobuttons.py
    4	
    5	import pygtk
    6	pygtk.require('2.0')
    7	import gtk
    8	
    9	class RadioButtons:
   10	    def callback(self, widget, data=None):
   11	        print "%s was toggled %s" % (data, ("OFF", "ON")[widget.get_active()])
   12	
   13	    def close_application(self, widget, event, data=None):
   14	        gtk.main_quit()
   15	        return gtk.FALSE
   16	
   17	    def __init__(self):
   18	        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
   19	  
   20	        self.window.connect("delete_event", self.close_application)
   21	
   22	        self.window.set_title("radio buttons")
   23	        self.window.set_border_width(0)
   24	
   25	        box1 = gtk.VBox(gtk.FALSE, 0)
   26	        self.window.add(box1)
   27	        box1.show()
   28	
   29	        box2 = gtk.VBox(gtk.FALSE, 10)
   30	        box2.set_border_width(10)
   31	        box1.pack_start(box2, gtk.TRUE, gtk.TRUE, 0)
   32	        box2.show()
   33	
   34	        button = gtk.RadioButton(None, "radio button1")
   35	        button.connect("toggled", self.callback, "radio button 1")
   36	        box2.pack_start(button, gtk.TRUE, gtk.TRUE, 0)
   37	        button.show()
   38	
   39	        button = gtk.RadioButton(button, "radio button2")
   40	        button.connect("toggled", self.callback, "radio button 2")
   41	        button.set_active(gtk.TRUE)
   42	        box2.pack_start(button, gtk.TRUE, gtk.TRUE, 0)
   43	        button.show()
   44	
   45	        button = gtk.RadioButton(button, "radio button3")
   46	        button.connect("toggled", self.callback, "radio button 3")
   47	        box2.pack_start(button, gtk.TRUE, gtk.TRUE, 0)
   48	        button.show()
   49	
   50	        separator = gtk.HSeparator()
   51	        box1.pack_start(separator, gtk.FALSE, gtk.TRUE, 0)
   52	        separator.show()
   53	
   54	        box2 = gtk.VBox(gtk.FALSE, 10)
   55	        box2.set_border_width(10)
   56	        box1.pack_start(box2, gtk.FALSE, gtk.TRUE, 0)
   57	        box2.show()
   58	
   59	        button = gtk.Button("close")
   60	        button.connect_object("clicked", self.close_application, self.window,
   61	                              None)
   62	        box2.pack_start(button, gtk.TRUE, gtk.TRUE, 0)
   63	        button.set_flags(gtk.CAN_DEFAULT)
   64	        button.grab_default()
   65	        button.show()
   66	        self.window.show()
   67	
   68	def main():
   69	    gtk.main()
   70	    return 0        
   71	
   72	if __name__ == "__main__":
   73	    RadioButtons()
   74	    main()

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