Les fenêtres avec barres de défilement servent à créer une zone défilante contenant un autre widget. On peut insérer n'importe quel widget dans ces fenêtres, ils seront accessibles quelle que soit leur taille en utilisant les barres de défilement.
La fonction suivante sert à créer une fenêtre avec barre de défilement
scrolled_window = gtk.ScrolledWindow(hadjustment
=None,vadjustment
=None)
...où le premier paramètre est l'ajustement horizontal, et le second
l'ajustement vertical. Ils valent presque toujours None
ou ne sont pas indiqués.
scrolled_window.set_policy(hscrollbar_policy
,vscrollbar_policy
)
Cette méthode définit la politique à utiliser par rapport aux barres de défilement. Le premier argument règle la politique pour la barre de défilement horizontale, et le second, la politique pour la barre de défilement verticale.
Cette politique peut être POLICY_AUTOMATIC
ou
POLICY_ALWAYS
. POLICY_AUTOMATIC
décidera automatiquement de votre besoin en barres de défilement, alors
que POLICY_ALWAYS
affichera toujours celles-ci.
On peut ensuite placer un objet dans la fenêtre à défilement grâce à la méthode :
scrolled_window.add_with_viewport(child
)
Le programme scrolledwin.py place 100 boutons commutateurs dans une fenêtre à défilement. Je n'ai commenté que les parties qui pouvaient vous paraître nouvelles. La Figure 10.7, « Exemple de fenêtre à défilement » montre l'affichage du programme :
Voici le code source du programme scrolledwin.py
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # exemple scrolledwin.py 4 5 import pygtk 6 pygtk.require('2.0') 7 import gtk 8 9 class ExempleScrolledWindow: 10 def destroy(self, widget): 11 gtk.main_quit() 12 13 def __init__(self): 14 # Créer une boîte de dialogue pour y placer 15 # la fenêtre à défilement 16 fenetre = gtk.Dialog() 17 fenetre.connect("destroy", self.destroy) 18 fenetre.set_title("Fenêtre à défilement") 19 fenetre.set_border_width(0) 20 fenetre.set_size_request(300, 300) 21 22 # Créer une fenêtre à défilement. 23 fenetre_defil = gtk.ScrolledWindow() 24 fenetre_defil.set_border_width(10) 25 26 # La gestion des barres est soit POLICY AUTOMATIC, soit POLICY_ALWAYS. 27 # POLICY_AUTOMATIC décide automatiquement s'il faut ou non des barres, 28 # POLICY_ALWAYS met toujours des barres 29 # Le premier paramètre correspond à la barre horizontale, 30 # le second à la barre verticale. 31 fenetre_defil.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_ALWAYS) 32 33 # Créer une boîte de dialogue avec une boîte verticale. 34 fenetre.vbox.pack_start(fenetre_defil, True, True, 0) 35 fenetre_defil.show() 36 37 # Créer une table de 10x10 cases. 38 table = gtk.Table(10, 10, False) 39 40 # Définir l'espacement des lignes et colonnes à 10 pixels. 41 table.set_row_spacings(10) 42 table.set_col_spacings(10) 43 44 # Placer la table dans la fenêtre à défilement. 45 fenetre_defil.add_with_viewport(table) 46 table.show() 47 48 # Créer une grille de boutons commutateurs dans la table 49 # pour la démonstration de la fenêtre à défilement 50 for i in range(10): 51 for j in range(10): 52 buffer = "bouton (%d,%d)" % (i, j) 53 bouton = gtk.ToggleButton(buffer) 54 table.attach(bouton, i, i+1, j, j+1) 55 bouton.show() 56 57 # Ajouter un bouton « Fermer » en bas de la boîte de dialogue. 58 bouton = gtk.Button("Fermer") 59 bouton.connect_object("clicked", self.destroy, fenetre) 60 61 # Définir ce bouton en « bouton par défaut ». 62 bouton.set_flags(gtk.CAN_DEFAULT) 63 fenetre.action_area.pack_start(bouton, True, True, 0) 64 65 # Récupérer le bouton par défaut. Presser 66 # la touche « Entrée » activera le bouton. 67 bouton.grab_default() 68 bouton.show() 69 fenetre.show() 70 71 def main(): 72 gtk.main() 73 return 0 74 75 if __name__ == "__main__": 76 ExempleScrolledWindow() 77 main()
Jouez à modifer la taille de la fenêtre et observez les
réactions des barres de défilement. On peut aussi utiliser la fonction
set_size_request
() pour définir la taille par
défaut de la fenêtre et des autres widgets.