Les Tables
1. Présentation
Dans la famille des containers, voilà sûrement le widget le plus intéressant. En effet il peut être parfois douloureux de placer correctement son interface avec l'utilisation de plusieurs
GtkBox. Le widget
GtkTable est conçu pour résoudre ce problème car il utilise une grille invisible pour attacher les widgets mais sans pour autant perdre la puissance de GTK+ avec le redimensionnement automatique.
1.1 Hiérarchie
GObject ->
GtkObject ->
GtkWidget ->
GtkContainer ->
GtkTable
2. Utilisation de base
Au moment de la création de la
GtkTable, nous allons spécifier le nombre de lignes et de colonnes, puis y placer les éléments avec 3 principales caractéristiques :
- la position de départ et de fin de l'élément par rapport aux lignes ;
- la position de départ et fin de l'élément par rapport aux colonnes ;
- la façon de réagir du widget (remplir la zone, agrandir, etc...).
2.1 Création d'une GtkTable
La classe à utiliser est :
table = gtk.Table(rows, columns, homogeneous)
Les paramètres
rows et
columns permettent de définir respectivement le nombre de lignes et de colonnes de la grille. Le paramètre
homogeneous quant à lui définit, comme pour une
GtkBox, si tous les widgets contenus dans la
GtkTable utilisent un espace équivalent.
2.2 Insertion d'éléments
La première méthode étudiée est :
table.attach(child, left_attach, right_attach, top_attach, bottom_attach, xoptions, yoptions, xpadding, ypadding)
A première vue, cette méthode peut apparaître compliquée, mais elle est en réalité très simple. Le paramètre
child représente le widget à attacher à la grille, les paramètres
left_attach et
right_attach, les positions à gauche et à droite du widget et les paramètres
top_attach et
bottom_attach, les positions supérieures et inférieures du widget.
Les paramètres
xoptions et
yoptions permettent de spécifier respectivement la façon dont le widget réagit horizontalement et verticalement au redimensionnement de la
GtkTable. Ces paramètres peuvent prendre 3 valeurs (que l'on peut associer) :
- gtk.EXPAND : spécifie que cette section de la grille s'étirera pour remplir l'espace disponible ;
- gtk.SHRINK : détermine ce qui se produira s'il y a un espace insuffisant pour répondre à la requête de taille du widget enfant, alors le widget se voit attribué une allocation réduite, ce qui peut entraîner un effet de "bords coupés" ;
- gtk.FILL : spécifie que le widget enfant s'étirera pour remplir l'espace disponible, important que si gtk.EXPAND est défini.
Les deux derniers paramètres
xpadding et
ypadding définissent l'espace supplémentaire à ajouter aux bords du widget (à droite et à gauche pour le premier, au-dessus et en dessous pour le second).
La deuxième méthode est : FIXME: EST-CE DISPONIBLE DANS PYTHON ? => cette deuxième méthode est bien disponible mais déprécié.
table.attach_defaults(child, left_attach, right_attach, top_attach, bottom_attach)
Ceci est la version simplifiée de la première fonction car elle définit automatiquement les paramètres
xoptions et
yoptions à gtk.EXPAND | gtk.FILL et les paramètres
xpadding et
ypadding à 0.
2.3 Modification de la table
Il est possible de changer la taille de la grille après sa création à l'aide de cette méthode :
table.resize(rows, columns)
Les paramètres
rows et
columns sont les nouveaux nombres de lignes et de colonnes.
Ces deux méthodes permettent de changer l'espace d'une ligne ou d'une colonne spécifique :
table.set_row_spacing(row, spacing)
table.set_col_spacing(column, spacing)
La première définit l'espace autour d'une ligne tandis que la deuxième fait la même chose pour une colonne.
Celles-ci ont le même rôle que les deux précédentes méthodes, mais agissent sur l'ensemble de la
GtkTable :
table.set_row_spacings(spacing)
table.set_col_spacings(spacing)
FIXME: A VOIR...
Et pour connaître ces espacements nous avons quatre méthodes différentes :
row = table.get_row_spacing()
column = table.get_col_spacing(column)
row = table.get_default_row_spacing()
column = table.get_default_col_spacing()
Les deux premières méthodes permettent de connaître l'espace entre ligne numéro
row (ou la colonne numéro
column) et sa suivante. Les deux autres méthodes quant à elles, renvoient la valeur par défaut des espacements, c'est à dire la valeur qui sera utilisé au prochain ajout d'un widget.
2.4 Programme exemple
Nous allons utiliser le même exemple que dans le chapitre sur les
GtkBox, pour bien montrer la différence au niveau du code.
# -*- Encoding: Latin-1 -*-
import gtk
def main():
boutons = []
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_default_size(320, 200)
window.set_title("Les GtkTable")
window.connect("destroy", gtk.main_quit), None)
# Creation et insertion de la table 3 lignes 2 colonnes
table = gtk.Table(3,2,True)
window.add(table)
# Creation des boutons
for i in range(4):
boutons.append( gtk.Button("Bouton %d" % (i+1)) )
# Insertion des boutons
table.attach(boutons[0], 0, 2, 0, 1, gtk.EXPAND | gtk.FILL, gtk.EXPAND, 0, 0)
table.attach_defaults(boutons[1], 0, 1, 1, 2)
table.attach(boutons[2], 1, 2, 1, 2, gtk.EXPAND, gtk.EXPAND | gtk.FILL, 0, 0)
table.attach_defaults(boutons[3], 0, 2, 2, 3)
window.show_all()
gtk.main()
if __name__ == '__main__':
main()