Les fenêtres avec barres de défilement
1. Introduction
Nous allons cette fois voir un widget qui permet d'ajouter des barres de défilement au widget qui sera son enfant. Il s'agit d'un widget container qui s'appelle gtk.
ScrolledWindow?.
1.1 Hiérarchie
gobject.GObject -> gtk.Object -> gtk.Widget -> gtk.Container -> gtk.Bin -> gtk.
ScrolledWindow?
2. Utilisation de base
2.1 Création
Comme vous pouvez vous y attendre, le constructeur est comme tous les autres, c'est à dire prévisible.
scroll_bar = gtk.ScrolledWindow?(hadjustment=None, vadjustment=None)
Les paramètres
hadjustment et
vadjustment permettent de définir les propriétés des barres de défilement. L'objet gtk.Adjustment permet dans notre cas, de définir (entre autres) la valeur minimale que peut prendre la barre de défilement et le pas de celle-ci.
Mais à moins de connaître exactement tous ces paramètres, il vaut mieux laisser faire Gtk (et Python), et ne pas passer d'argument.
2.2 Ajout du widget enfant.
Pour cela, il y a deux cas différents. Si par exemple le widget enfant a la capacité d'avoir ses propres barres de défilement, il suffit d'utiliser la méthode
add de l'objet
gtk.Container.
Par contre, dans le cas ou le widget ne possède pas cette capacité, il faudra utiliser cette méthode :
scroll_bar.add_with_viewport(child)
Avec cette méthode, Gtk va créer ce qui s'appelle un viewport (qui peut avoir des barres de défilement) et va insérer l'enfant dans ce viewport.
Seuls les widgets gtk.
TreeView?, gtk.
TextView?, et gtk.Layout ont la possibilité d'avoir des barres de défilement. Pour les autres widgets (comme les gtk.HBox, gtk.VBox, ...) il faudra utiliser la deuxième méthode.
2.3 Affichage des barres de défilement.
Par défaut, les barres de défilement s'affichent automatiquement (que ce soit la barre horizontale ou verticale). Il se peut que, par exemple, vous n'ayez besoin que de la barre verticale. Dans ce cas vous ne voulez sûrement pas avoir de barre de défilement horizontale. La solution à votre problème est cette méthode :
scroll_bar.set_policy(hscrollbar_policy, vscrollbar_policy)
Les paramètres
hscrollbar_policy et
vscrollbar_policy peuvent prendre trois paramètres :
- gtk.POLICY_ALWAYS : la barre de défilement est toujours affichée.
- gtk.POLICY_AUTOMATIC : la barre de défilement n'est affichée que si elle est utile.
- gtk.POLICY_NEVER : la barre de défilement n'est jamais affichée.
Au contraire, pour savoir si elles sont affichées ou pas, il y a la méthode :
scroll_bar.get_policy(hscrollbar_policy, vscrollbar_policy)
2.4 Positionnement des barres de défilement.
Par défaut, les barres de défilement sont positionnées à droite pour la barre verticale et en bas pour la barre horizontale. Mais ce comportement peut ne pas vous satisfaire. Pour remédier à cela, vous pouvez utiliser cette méthode :
scroll_bar.set_placement(window_placement)
Le paramètre
window_placement peut prendre quatre valeurs différentes :
- gtk.CORNER_TOP_LEFT : la barre verticale à droite et la barre horizontale en bas (comportement par défaut).
- gtk.CORNER_BOTTOM_LEFT : la barre verticale à droite et la barre horizontale en haut.
- gtk.CORNER_TOP_RIGHT : la barre verticale à gauche et la barre horizontale en bas.
- gtk.CORNER_BOTTOM_RIGHT : la barre verticale à gauche et la barre horizontale en haut.
Pour connaître le positionnement des barres actuellement utilisé pour votre widget, il faut utiliser la méthode :
scroll_bar.get_placement()
qui retourne une des 4 valeurs précédemment citées.
2.5 Construction du programme exemple.
Notre exemple est très simple. Il consiste uniquement à afficher 10 labels les uns au-dessus des autres dans une fenêtre qui n'excèdera pas une taille de 320x200. Voyons à quoi ressemble notre fenêtre si elle n'utilise pas les barres de défilement.
Et voila le résultat, la fenêtre ne respecte pas la condition TAILLE = 320x200. Il faut utiliser le widget gtk.
ScrolledWindow?.
# -*- encoding: utf-8 -*-
import pygtk
pygtk.require('2.0')
import gtk
def main():
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_default_size(320, 200)
window.set_title('gtk.ScrolledWindow')
window.connect('destroy', gtk.main_quit, 0)
scroll_bar = gtk.ScrolledWindow()
window.add(scroll_bar)
box = gtk.VBox(spacing=5)
scroll_bar.add_with_viewport(box)
scroll_bar.set_policy(gtk.POLICY_NEVER, gtk.POLICY_ALWAYS)
for i in range(1, 10):
label = gtk.Label('Label ' + str(i))
box.pack_start(label, False, False, 5)
window.show_all()
gtk.main()
if __name__ == '__main__':
main()
Résultats

