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

Chapitre 10. Les widgets conteneurs

Table des matières

10.1. La boîte à évènement (EventBox)
10.2. Le widget d'alignement (Alignment)
10.3. Le conteneur Place (Fixed)
10.4. Le conteneur Layout (Affiche)
10.5. Les cadres (Frame)
10.6. Les cadres proportionnels (AspectFrame)
10.7. Fenêtre à volets (Paned Window)
10.8. Viewports
10.9. Fenêtre avec barres de défilement (Scrolled Window)
10.10. Boîtes à boutons (ButtonBox)
10.11. La barre d'outils (Toolbar)
10.12. Le bloc-notes (Notebook)
10.13. Les connexions et connecteurs (Plugs et Sockets)
10.13.1. Les Plugs
10.13.2. Sockets

10.1. La boîte à évènement (EventBox)

Certains widgets GTK ne possèdent pas de fenêtre X associée, ils se dessinent juste sur leur widget parent. Donc, ils ne peuvent recevoir d'évènements et si leurs dimensions sont incorrectes, ils ne s'ajustent pas et vous pouvez obtenir des chevauchements d'écriture, etc. Si vous voulez obtenir plus de ces widgets, il faut utiliser la boîte à évènement EventBox.

À première vue, la boîte à évènement EventBox peut sembler totalement inutile. Elle ne dessine rien sur l'écran et ne répond à aucun évènement. Cependant, elle réalise une fonction :elle fournit une fenêtre X pour son widget enfant. Et comme beaucoup de widgets ne possèdent pas de fenêtre X associée, cette fonction est importante. Ne pas de fenêtre X économise de la memoire et augmente les performances mais a aussi quelques inconvénients. Un widget sans fenêtre X ne peut recevoir d'évènement, ne peut réaliser aucun ajustement sur son contenu et ne peut posséder de couleur d'arrière-plan. Quoique le nom EventBox met en évidence la fonction de gestion d'évènement, ce widget peut aussi être redimensionné, (et plus encore, voir l'exemple ci-dessous).

Pour créer une nouvelle boîte à évènement EventBox, faire :

  boite_evenement = gtk.EventBox()

Un widget enfant peut être ajouté à la boîte à évènement par :

  event_box.add(widget) 

Le programme d'exemple eventbox.py illustre les deux utilisations de la boîte à évènement. Créer un label, inscrit dans une petite boîte, possédant un arrière-plan vert et permettant, lors d'un clic sur ce label, de sortir du programme. Redimensionner la fenêtre permet les variations de taille du label. La Figure 10.1, « Exemple de boîte à évènement » montre l'affichage du programme.

Figure 10.1. Exemple de boîte à évènement

Exemple de boîte à évènement
Exemple de boîte à évènement

Voici le code source du programme eventbox.py :

     1   #!/usr/bin/env python
     2   # -*- coding:utf-8 -*-
     3   # exemple eventbox.py
     4   
     5   import pygtk
     6   pygtk.require('2.0')
     7   import gtk
     8   
     9   class ExempleBoiteEvenement:
    10       def __init__(self):
    11           fenetre = gtk.Window(gtk.WINDOW_TOPLEVEL)
    12           fenetre.set_title("Boîte à évènement")
    13           fenetre.connect("destroy", lambda w: gtk.main_quit())
    14           fenetre.set_border_width(10)
    15   
    16           # On crée une boîte à évènement et on l'ajoute à la fenêtre principale
    17           boite_evenement = gtk.EventBox()
    18           fenetre.add(boite_evenement)
    19           boite_evenement.show()
    20   
    21           # On crée un label long
    22           label = gtk.Label("Cliquer ici pour quitter, finir, terminer, sortir...")
    23           boite_evenement.add(label)
    24           label.show()
    25   
    26           # On fixe sa taille de départ (largeur, hauteur).
    27           label.set_size_request(110, 30)
    28   
    29           # On relie une action à la boîte
    30           boite_evenement.set_events(gtk.gdk.BUTTON_PRESS_MASK)
    31           boite_evenement.connect("button_press_event", lambda w,e: gtk.main_quit())
    32   
    33           # D'autres choses pour lesquelles il faut une fenêtre X...
    34           boite_evenement.realize()
    35           boite_evenement.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.HAND1))
    36   
    37           # Un arrière-plan en vert
    38           boite_evenement.modify_bg(gtk.STATE_NORMAL,
    39                               boite_evenement.get_colormap().alloc_color("green"))
    40   
    41           fenetre.show()
    42   
    43   def main():
    44       gtk.main()
    45       return 0
    46   
    47   if __name__ == "__main__":
    48       ExempleBoiteEvenement()
    49       main()