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

3.2. Modification de notre "Hello World"

    1   #!/usr/bin/env python
    2   # -*- coding:utf-8 -*-
    3   # exemple helloworld2.py
    4   
    5   import pygtk
    6   pygtk.require('2.0')
    7   import gtk
    8   
    9   class HelloWorld2:
   10   
   11       # Notre fonction de rappel ameliorée. Les données
   12       # qui lui sont transmises sont affichées sur stdout.
   13       def salut(self, widget, donnees):
   14           print "Re-salut ! - Clic sur le %s" % donnees
   15   
   16       # Une autre fonction de rappel
   17       def evnmt_delete(self, widget, evenement, donnees=None):
   18           gtk.main_quit()
   19           return False
   20   
   21       def __init__(self):
   22           # Création d'une nouvelle fenêtre
   23           self.fenetre = gtk.Window(gtk.WINDOW_TOPLEVEL)
   24   
   25           # Nouvel appel, qui donne le titre "Salut les boutons !"
   26           # à notre nouvelle fenêtre
   27           self.fenetre.set_title("Salut les boutons !")
   28   
   29           # Ici on définit juste un gestionnaire pour le signal
   30           # delete_event (qui quittera GTK immédiatement)
   31           self.fenetre.connect("delete_event", self.evnmt_delete)
   32   
   33           # On fixe la largeur des bordures de la fenêtre.
   34           self.fenetre.set_border_width(10)
   35   
   36           # On crée une boîte pour y placer des widgets. Nous y reviendrons
   37           # en détail dans la section "placement". La boîte n'est pas visible,
   38           # c'est juste un outil pour disposer des widgets.
   39           self.boite1 = gtk.HBox(False, 0)
   40   
   41           # On place la boîte dans la fenêtre principale.
   42           self.fenetre.add(self.boite1)
   43   
   44           # Création d'un nouveau bouton avec l'étiquette "Bouton 1".
   45           self.bouton1 = gtk.Button("Bouton 1")
   46   
   47           # Lorsqu'on cliquera sur le bouton, la ligne suivante appellera la
   48           # méthode "salut" avec la chaîne "bouton 1" comme argument.
   49           self.bouton1.connect("clicked", self.salut, "bouton 1")
   50   
   51           # Plutôt que add(), on utilise pack_start() afin de placer le bouton 
   52           # dans la boîte invisible (qui a elle-même été placée dans la fenêtre).
   53           self.boite1.pack_start(self.bouton1, True, True, 0)
   54   
   55           # N'oubliez pas cette étape, elle fait savoir à GTK que la préparation
   56           # de ce bouton est terminée et qu'il peut maintenant être affiché
   57           self.bouton1.show()
   58   
   59           # On répète les mêmes étapes pour créer un second bouton
   60           self.bouton2 = gtk.Button("Bouton 2")
   61   
   62           # On appelle la même fonction de rappel, mais avec un argument
   63           # différent : la chaîne de caractères "bouton 2".
   64           self.bouton2.connect("clicked", self.salut, "bouton 2")
   65   
   66           self.boite1.pack_start(self.bouton2, True, True, 0)
   67   
   68           # L'ordre d'affichage des boutons n'est pas trés important, mais je conseille
   69           # d'afficher la fenêtre en dernier pour que tout s'affiche d'un seul coup.
   70           self.bouton2.show()
   71           self.boite1.show()
   72           self.fenetre.show()
   73   
   74   def boucle():
   75       gtk.main()
   76   
   77   if __name__ == "__main__":
   78       salut = HelloWorld2()
   79       boucle()
   

L'exécution de helloworld2.py produit la fenêtre représentée à la Figure 3.1, « Exemple de "Hello World" amélioré ».

Figure 3.1. Exemple de "Hello World" amélioré

Exemple de "Hello World" amélioré

À noter que cette fois, rien n'a été prévu pour sortir du programme, il faut utiliser le gestionnaire de fenêtres ou la ligne de commande. En guise d'exercice, vous pourriez ajouter un troisième bouton "Quitter" qui mettrait fin au programme. Amusez-vous aussi avec les différentes possibilités de la méthode pack_start() en lisant le prochain chapitre. Essayez de redimensionner la fenêtre et observez son comportement.

Voici un bref commentaire des parties du code qui ont changé par rapport à notre premier "Hello World" :

Comme précisé plus haut, il n'y a pas de gestionnaire du signal "destroy" dans notre version améliorée.

La fonction de rappel salut() des lignes 13-14 est similaire à celle de la première version. La différence est qu'elle affiche désormais un message contenant les données qu'elle a reçues.

À la ligne 27, on définit une chaine de caractères qui s'affichera dans la barre de titre de la fenêtre (voir Figure 3.1, « Exemple de "Hello World" amélioré »).

La ligne 39 crée une boîte horizontale (gtk.HBox) destinée à contenir les deux boutons créés aux lignes 45 et 60. On place cette boîte dans le conteneur fenetre à la ligne 42.

Aux lignes 49 et 64, on connecte la méthode salut() au signal "clicked" émis par les boutons. Chaque bouton définit une chaine de caractères différente qui sera transmise à la méthode salut() lors de son appel.

On place les boutons dans la boîte horizontale aux lignes 53 et 66 ; ils seront affichés par GTK aux lignes 57 et 70.

Enfin, on affiche la boîte et la fenêtre, respectivement aux lignes 71 et 72.