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.
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()