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

10.9. Fenêtre avec barres de défilement (Scrolled Window)

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 :

Figure 10.7. Exemple de fenêtre à défilement

Exemple de fenêtre à défilement
Exemple de fenêtre à défilement

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.