Vous êtes à peu près ici : Accueil  »   tutoriel PyGTK  »   PyGTK : sommaire

6.4. Les boutons radio

Les boutons radio sont similaires aux cases à cocher, à ceci près qu'on les assemble par groupes, dans lesquels un seul bouton peut être sélectionné/enfoncé à la fois. Ils sont très pratiques pour les parties de vos applications où l'on doit effectuer une sélection parmi une courte liste.

La création d'un nouveau bouton radio s'effectue avec l'appel suivant :

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

Vous aurez remarqué le nouvel argument group pour cet appel. En effet, pour fonctionner correctement, les boutons radio nécessitent un groupe. Lors du premier appel à gtk.RadioButton(), l'argument group doit valoir None, ce qui créera un nouveau groupe comptant comme seul membre le nouveau bouton radio.

Pour ajouter de nouveaux boutons radio à un groupe, transmettez lors de vos appels à gtk.RadioButton() une référence à un bouton radio du groupe.

Si vous avez spécifié un texte pour l'argument label, il sera passé en revue à la recherche de caractères mnémoniques (préfixés par '_').

Pour définir explicitement le bouton qui doit être sélectionné par défaut, utilisez :

  bouton_radio.set_active(is_active)

Cette méthode est décrite dans la section sur les boutons à bascule et fonctionne exactement de la même manière. Une fois que les boutons radio sont assemblés en un groupe, on ne pourra sélectionner qu'un seul bouton de ce groupe à la fois. Si l'utilisateur clique sur un bouton radio, puis sur un autre, alors le premier émettra un signal "toggled" pour informer qu'il a été désactivé, avant que le second l'imite, pour signaler cette fois qu'il vient d'être activé.

Le programme exemple boutonsradio.py crée un groupe de trois boutons radio. La figure 6.4 montre la fenêtre obtenue :

Figure 6.4. Exemple de boutons radio

Voici le code source du programme :

     1   #!/usr/bin/env python
     2   
     3   # exemple boutonsradio.py
     4   
     5   import pygtk
     6   pygtk.require('2.0')
     7   import gtk
     8   
     9   class BoutonsRadio:
    10       def fct_rappel(self, widget, donnees=None):
    11           print "Le %s a ete %s." % (donnees, ("desactive", "active")[widget.get_active()])
    12   
    13       def quitter_pgm(self, widget, evenement, donnees=None):
    14           gtk.main_quit()
    15           return False
    16   
    17       def __init__(self):
    18           self.fenetre = gtk.Window(gtk.WINDOW_TOPLEVEL)
    19   
    20           self.fenetre.connect("delete_event", self.quitter_pgm)
    21   
    22           self.fenetre.set_title("Boutons radio")
    23           self.fenetre.set_border_width(0)
    24   
    25           boite1 = gtk.VBox(False, 0)
    26           self.fenetre.add(boite1)
    27           boite1.show()
    28   
    29           boite2 = gtk.VBox(False, 10)
    30           boite2.set_border_width(10)
    31           boite1.pack_start(boite2, True, True, 0)
    32           boite2.show()
    33   
    34           bouton = gtk.RadioButton(None, "bouton radio 1")
    35           bouton.connect("toggled", self.fct_rappel, "bouton radio 1")
    36           boite2.pack_start(bouton, True, True, 0)
    37           bouton.show()
    38   
    39           bouton = gtk.RadioButton(bouton, "bouton radio 2")
    40           bouton.connect("toggled", self.fct_rappel, "bouton radio 2")
    41           bouton.set_active(True)
    42           boite2.pack_start(bouton, True, True, 0)
    43           bouton.show()
    44   
    45           bouton = gtk.RadioButton(bouton, "bouton radio 3")
    46           bouton.connect("toggled", self.fct_rappel, "bouton radio 3")
    47           boite2.pack_start(bouton, True, True, 0)
    48           bouton.show()
    49   
    50           separateur = gtk.HSeparator()
    51           boite1.pack_start(separateur, False, True, 0)
    52           separateur.show()
    53   
    54           boite2 = gtk.VBox(False, 10)
    55           boite2.set_border_width(10)
    56           boite1.pack_start(boite2, False, True, 0)
    57           boite2.show()
    58   
    59           bouton = gtk.Button("fermer")
    60           bouton.connect_object("clicked", self.quitter_pgm, 
    61                                 self.fenetre, None)
    62           boite2.pack_start(bouton, True, True, 0)
    63           bouton.set_flags(gtk.CAN_DEFAULT)
    64           bouton.grab_default()
    65           bouton.show()
    66           self.fenetre.show()
    67   
    68   def main():
    69       gtk.main()
    70       return 0        
    71   
    72   if __name__ == "__main__":
    73       BoutonsRadio()
    74       main()

Le code est assez explicite. Aux lignes 63-64, on fait du bouton "fermer" le widget par défaut, de sorte qu'en appuyant sur la touche "Entrée" lorsque la fenêtre est active il émette le signal "clicked".