Les Box
1. Présentation
Vous avez sûrement dû essayer de mettre plusieurs widgets dans une fenêtre mais sans succès. Cela est dû au fait qu'un widget de type
GtkContainer ne peut contenir qu'un seul widget. La solution à ce problème est l'utilisation des widgets de type
GtkBox qui permettent d'inclure plusieurs widgets à l'intérieur.
Il existe deux catégories de
GtkBox :
- les GtkHBox qui permettent de disposer les widgets horizontalement ;
- les GtkVBox pour les disposer verticalement.
1.1 Hiérarchie
GObject ->
GtkObject ->
GtkWidget ->
GtkContainer ->
GtkBox ->
GtkHBox
GObject ->
GtkObject ->
GtkWidget ->
GtkContainer ->
GtkBox ->
GtkVBox
2. Utilisation de base
2.1 Création
Comme toujours, la création de ces widgets est très simple. Les fonctions suivantes permettent de créer respectivement une
GtkHBox et une
GtkVBox :
hbox = gtk.HBox(homogeneous, spacing)
vbox = gtk.VBox(homogeneous, spacing)
Le paramètre
homogeneous définit si tous les widgets contenus dans la
GtkBox utilisent un espace équivalent. C'est à dire que si ce paramètre est à True, la zone d'affichage de la
GtkBox sera divisée en x zone(s) de taille égale (x étant le nombre de widgets contenus).
Le paramètre
spacing permet de définir l'espacement entre chacun des widgets contenus.
2.2 Ajout de widget
Avant de pouvoir ajouter un widget dans une
GtkHBox ou
GtkVBox, il faut savoir que pour une
GtkBox il existe la notion de premier et de dernier widget. Nous allons donc pouvoir ajouter des widgets soit par le début soit par la fin avec une de ces deux méthodes :
box.pack_start(child, expand, fill, padding)
box.pack_end(child, expand, fill, padding)
La première méthode ajoute les widgets de haut en bas et la deuxième de bas en haut.
Pour les paramètres, ce sont les mêmes pour les deux méthodes. Le paramètre
child est le widget qui va être ajouté à la box.
Le deuxième paramètre
expand nécessite un petite explication. Nous ne le voyons pas ici, mais lors de la création d'une
GtkHBox ou
GtkVBox, il faut définir une propriété appelée
homogeneous. Cette propriété détermine si les widgets qui sont à l'intérieur de la
GtkBox vont se partager l'intégralité de l'espace fourni, ou alors réserver uniquement la place qui leur est nécessaire.
Petit exemple, nous avons un espace de 3 pixel dans lequel nous voulons insérer deux widgets de 1 pixel. Si le paramètre
homogeneous est à True, chaque widget réservera un espace de 1.5 pixel. Au contraire si il est à False, chaque widget réservera un espace de 1 pixel, laissant donc un espace libre de 1 pixel à la fin.
Revenons donc au paramètre
expand. Si la
GtkBox est homogène, la valeur de ce paramètre n'a aucune importance. Par contre si la
GtkBox n'est pas homogène, le fait de mettre
expand à True à un widget va lui permettre de partager l'espace restant dans la
GtkBox avec les autres widgets qui auront été insérés avec
expand à True.
Reprenons notre exemple. La
GtkBox n'est pas homogène, donc normalement chaque widget va réserver 1 pixel de l'espace. Si nous mettons le premier widget avec
expand à True et le deuxième avec
expand à False, le deuxième widget réservera un espace de 1 pixel, le premier aussi mais il doit se partager l'espace libre (1 pixel) avec les autres widgets qui ont aussi la propriété
expand à True. Comme il est tout seul avec cette propriété, il va donc réserver 2 pixel.
Le paramètre
fill permet de définir si le widget enfant occupe toute la zone qui lui est réservée.
Et enfin, le paramètre
padding permet d'ajouter de l'espace autour du widget.
Voici quelques exemples avec différentes valeurs pour ces paramètres :
homogeneous=True ; Bouton 1 : fill=False ; Bouton 2 : fill=False
homogeneous=True ; Bouton 1 : fill=False ; Bouton 2 : fill=True
homogeneous=False ; Bouton 1 : expand=False ; Bouton 2 : expand=False
homogeneous=False ; Bouton 1 : expand=False ; Bouton 2 : expand=True - fill=False
homogeneous=False ; Bouton 1 : expand=False ; Bouton 2 : expand=True - fill=True
2.3 Programme exemple
Pour ce chapitre, nous allons insérer quatre boutons dans une
GtkHBox et une
GtkVBox afin d'étudier les fonctions d'ajout du widget
GtkBox.
# -*- Encoding: Latin-1 -*-
import gtk
def main():
boutons = []
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_title("Les GtkBox")
window.set_default_size(320, 200)
window.connect("destroy", gtk.main_quit, None)
# Creation de la GtkBox verticale
vbox = gtk.VBox(True, 0)
# Ajout de la GtkVBox dans la fenetre
window.add(vbox)
# Creation des boutons
for i in range(4):
boutons.append( gtk.Button("Bouton %d" % (i+1)) )
# Ajout de Bouton 1 dans la GtkVBox
vbox.pack_start(boutons[0], True, False, 0)
# Creation de la box horizontale
hbox = gtk.HBox(True, 0)
# Ajout de la GtkHBox dans la GtkVBox
vbox.pack_start(hbox, True, True, 0)
# Ajout des boutons 2 et 3 dans la GtkHBox
hbox.pack_start(boutons[1], True, True, 0)
hbox.pack_start(boutons[2], True, False, 0)
# Ajout du dernier bouton dans la GtkVBox
vbox.pack_start(boutons[3], True, True, 0)
window.show_all()
gtk.main()
if __name__ == '__main__':
main()
Résultat
