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

10.7. Fenêtre à volets (Paned Window)

Le widget de fenêtre à volets permet de diviser une zone en deux parties, la taille relative de chaque partie est gérée par l'utilisateur. Un sillon, dessiné entre les deux parties, possède une poignée qui permet à l'utilisateur de modifier le partage. La dision peut être horizontale (HPaned) ou verticale (VPaned).

Pour créer une nouvelle fenêtre à volets, on appelle :

  volet_horiz = gtk.HPaned()

  volet_vert = gtk.VPaned()

Après avoir créé la fenêtre à volets, il faut ajouter un widget enfant dans chaque moitié. Pour cela, on utilise les méthodes :

  volet.add1(enfant)

  volet.add2(enfant)

La méthode add1() ajoute le widget enfant au volet gauche ou supérieur, la méthode add2() ajoute le widget enfant au volet droit ou inférieur de la fenêtre à volets.

Le programme paned.py crée une partie de l'interface utilisateur d'un logiciel de courrier électronique imaginaire. Une fenêtre est divisée en deux parties verticales, la partie supérieure comprend une liste de messages et la partie inférieure le texte du message. La plus grande part du programme est plutôt simple. Deux points sont cependant à noter : on ne peut ajouter de texte à un widget Texte tant qu'il n'est pas réalisé. Ce qui peut être fait en appelant la méthode realize(), mais comme démonstration d'une technique alternative, on connecte un gestionnaire au signal "realize" pour ajouter le texte. Il faudrait aussi ajouter l'option SHRINK à certains des items dans la partie contenant la fenêtre de texte et ses ascenseurs. Ainsi, lorsque la partie basse est réduite, les sections corrigées diminuent au lieu de disparaître par le bas de la fenêtre. La Figure 10.6, « Exemple de fenêtre à volets » illustre le programme en cours de fonctionnement.

Figure 10.6. Exemple de fenêtre à volets

Exemple de fenêtre à volets
Exemple de fenêtre à volets

Voici le code du programme paned.py :

     1   #!/usr/bin/env python
     2   # -*- coding:utf-8 -*-
     3   # example paned.py
     4   
     5   import pygtk
     6   pygtk.require('2.0')
     7   import gtk, gobject
     8   
     9   class ExempleVolets:
    10       # Crée la liste des "messages"
    11       def create_list(self):
    12           # Crée une nouvelle fenêtre à défilement avec ascenseurs si nécessaire
    13           fenetre_defil = gtk.ScrolledWindow()
    14           fenetre_defil.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
    15   
    16           modele = gtk.ListStore(gobject.TYPE_STRING)
    17           tree_view = gtk.TreeView(modele)
    18           fenetre_defil.add_with_viewport (tree_view)
    19           tree_view.show()
    20   
    21           # Ajoute quelques messages dans la fenêtre
    22           for i in range(10):
    23               msg = "Message #%d" % i
    24               iter = modele.append()
    25               modele.set(iter, 0, msg)
    26   
    27           cellule = gtk.CellRendererText()
    28           colonne = gtk.TreeViewColumn("Messages", cellule, text=0)
    29           tree_view.append_column(colonne)
    30   
    31           return fenetre_defil
    32      
    33       # Ajoute du texte au widget texte - ceci est un rappel qui est invoqué
    34       # quand la fenêtre est réalisée. On pourrait forcer aussi la fenêtre à être
    35       # réalisée avec gtk.Widget.realize(), mais elle devrait appartenir 
    36       # d'abord à une hiérarchie.
    37       def insert_text(self, buffer):
    38           iter = buffer.get_iter_at_offset(0)
    39           buffer.insert(iter,
    40                         "From: pathfinder@nasa.gov\n"
    41                         "To: mom@nasa.gov\n"
    42                         "Subject: Faites le !\n"
    43                         "\n"
    44                         "Nous sommes arrivés juste ce matin. \n"
    45                         "Le temps a été superbe, clair mais froid\n"
    46                         "et il y a plein de vues amusantes.\n"
    47                         "Sojourner vous dit bonjour. À bientôt.\n"
    48                         " -Path\n")
    49      
    50       # Crée une zone de texte avec ascenseurs qui affiche un "message"
    51       def create_text(self):
    52           vuetexte = gtk.TextView()
    53           buffer = vuetexte.get_buffer()
    54           fenetre_defil = gtk.ScrolledWindow()
    55           fenetre_defil.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
    56           fenetre_defil.add(vuetexte)
    57           self.insert_text(buffer)
    58           fenetre_defil.show_all()
    59           return fenetre_defil
    60      
    61       def __init__(self):
    62           fenetre = gtk.Window(gtk.WINDOW_TOPLEVEL)
    63           fenetre.set_title("Fenêtre à volets")
    64           fenetre.connect("destroy", lambda w: gtk.main_quit())
    65           fenetre.set_border_width(10)
    66           fenetre.set_size_request(450, 400)
    67   
    68           # Crée une fenêtre à volets verticale et l'ajoute à la fenêtre principale
    69           vpaned = gtk.VPaned()
    70           fenetre.add(vpaned)
    71           vpaned.show()
    72   
    73           # Crée le contenu des deux moitiés de la fenêtre
    74           liste = self.create_list()
    75           vpaned.add1(liste)
    76           liste.show()
    77   
    78           texte = self.create_text()
    79           vpaned.add2(texte)
    80           texte.show()
    81           fenetre.show()
    82   
    83   def main():
    84       gtk.main()
    85       return 0
    86   
    87   if __name__ == "__main__":
    88       ExempleVolets()
    89       main()