Étudions une autre méthode de placement : les tables. Elles peuvent s'avérer très utiles dans certaines situations.
En utilisant des tables, on crée une grille dans laquelle on peut placer les widgets. Ceux-ci peuvent occuper tous les endroits que l'on désire.
La première chose à faire est, bien sûr, d'étudier la fonction codice_1 :
 GtkWidget* gtk_table_new (gint rows,
 gint columns,
 gint homogeneous);
Le premier paramètre est le nombre de lignes de la table et le deuxième, le nombre de colonnes.
Le paramètre homogeneous s'occupe de la façon dont les cases de la table seront dimensionnées. Si homogeneous vaut codice_2, les cases prennent la taille du plus grand widget de la table. S'il vaut codice_3, la taille des cases dépend du widget le plus haut de la ligne et du plus large de cette colonne.
Le nombre de lignes et colonnes va de 0 à n, où n est le nombre spécifié dans l'appel à codice_1. Ainsi, avec codice_5 et codice_6, la table ressemblera à ceci :
 0 1 2
 0+----------+----------+
 1+----------+----------+
 2+----------+----------+
On notera que le système de coordonnées part du coin en haut à gauche. Pour placer un widget dans une case, ou utilise la fonction suivante :
 void gtk_table_attach (GtkTable *table,
 GtkWidget *child,
 gint left_attach,
 gint right_attach,
 gint top_attach,
 gint bottom_attach,
 gint xoptions,
 gint yoptions,
 gint xpadding,
 gint ypadding);
Où le premier paramètre (table) est la table que l'on a créée et le second (child) est le widget que l'on veut placer dans la table.
Les paramètres left_attach et right_attach spécifient l'emplacement du widget et le nombre de cases à utiliser. Par exemple, si on veut placer un bouton dans le coin inférieur droit de la table décrite plus haut et que l'on désire ne remplir QUE cette case, codice_7 vaudra 1, codice_8 vaudra 2; codice_9 vaudra 1 et codice_10 vaudra 2.
Si on veut un widget occupant toute la ligne supérieure de notre table, on utilisera les valeurs 0, 2, 0, 1.
Les paramètres xoptions et yoptions servent à préciser les options de placement et peuvent être combinées par un OU logique pour permettre des options multiples.
Ces options sont :
Les paramêtres de padding jouent le même rôle que pour les boîtes : ils créent une zone libre, spécifiée en pixels, autour du widget.
codice_15 a BEAUCOUP d'options. Voici donc une fonction-raccourci :
 void gtk_table_attach_defaults (GtkTable *table,
 GtkWidget *widget,
 gint left_attach,
 gint right_attach,
 gint top_attach,
 gint bottom_attach);
codice_16 et codice_17 valent par défaut codice_18, et codice_19 et codice_20 valent 0. Les autres paramètres sont les mêmes que ceux de la fonction précédente.
Il existe aussi les fonctions codice_21 et codice_22. Elles permettent de placer des espaces après une ligne ou une colonne.
 void gtk_table_set_row_spacing (GtkTable *table,
 gint row,
 gint spacing);
et
 void gtk_table_set_col_spacing (GtkTable *table,
 gint column,
 gint spacing);
Pour les colonnes, l'espace est ajouté à droite de la colonne et pour les lignes, il est ajouté en dessous.
On peut aussi configurer un espacement pour toutes les lignes et/ou colonnes avec :
 void gtk_table_set_row_spacings (GtkTable *table,
 gint spacing);
Et,
 void gtk_table_set_col_spacings (GtkTable *table,
 gint spacing);
Avec ces appels, la dernière ligne et la dernière colonne n'ont pas d'espace supplémentaire.

Programmation GTK/Exemple de placement avec table

4.5 Exemple de placement avec table
Pour le moment, étudiez l'exemple sur les tables (testgtk.c) distribué avec les sources de GTK.

Programmation GTK/Vue d'ensemble des widgets

Les étapes pour créer un "widget" en GTK sont :
codice_5 permet à GTK de savoir que l'on a fini de configurer les attributs du widget et qu'il est prêt à être affiché. On peut aussi utiliser codice_6 pour le faire disparaître. L'ordre dans lequel on affiche les widgets n'est pas important, mais il est préférable d'afficher la fenêtre en dernier pour qu'elle surgisse d'un seul coup plutôt que de voir les différents widgets apparaître à l'écran au fur et à mesure. Les fils d'un widget (une fenêtre est aussi un widget) ne seront pas affichés tant que la fenêtre elle-même n'est pas affichée par la fonction codice_5.

Programmation GTK/Conversions de types
Vous remarquerez, au fur et à mesure que vous progressez, que GTK utilise un système de coercition de type. Celle-ci est toujours réalisée en utilisant des macros qui vérifient si l'objet donné peut être converti et qui réalisent cette coercition. Les macros que vous rencontrerez le plus sont :
Elles sont toutes utilisées pour convertir les paramètres des fonctions. Vous les verrez dans les exemples et, en règle générale, vous saurez les utiliser simplement en regardant la déclaration d'une fonction.
Comme vous pouvez le voir dans la hiérarchie de classes ci-dessous, tous les "GtkWidgets" dérivent d'une classe de base codice_7. Ceci signifie que vous pouvez utiliser un widget à chaque fois qu'une fonction requiert un objet - il suffit d'utiliser la macro codice_8.
Par exemple :
 gtk_signal_connect(GTK_OBJECT(button), "clicked",
 GTK_SIGNAL_FUNC(fonction_rappel), <var>&lt;donnee_de_rappel&gt;</var>);
Cet appel convertit le bouton en objet et fournit une conversion pour le pointeur de fonction vers la fonction de rappel.
De nombreux widgets sont aussi des containers. Si vous regardez la hiérarchie de classe ci-dessous, vous remarquerez que beaucoup de widgets viennent de la classe GtkContainer. N'importe lequel de ces widgets peut être utilisé avec la macro codice_9 pour être passé en paramètre à une fonction qui attend un container.
Malheureusement, ces macros ne peuvent être couvertes en détail dans ce didacticiel, Je vous recommande donc de jeter un coup d’œil sur les fichier en-têtes GTK : ils peuvent s'avérer très instructifs. En fait, il n'est pas difficile de comprendre comment fonctionne un widget, il suffit d'étudier les déclarations des fonctions.

Programmation GTK/La hiérarchie des widgets

Voici l'arbre de la hiérarchie de classes utilisées pour implanter les widgets.
 GtkObject
 +-- GtkData
 | \-- GtkAdjustment
 \-- GtkWidget
 +-- GtkContainer
 | +-- GtkBin
 | | +-- GtkAlignment
 | | +-- GtkFrame
 | | | *-- GtkAspectFrame
 | | +-- GtkItem
 | | | +-- GtkListItem
 | | | +-- GtkMenuItem
 | | | | +-- GtkCheckMenuItem
 | | | | *-- GtkRadioMenuItem
 | | | *-- GtkTreeItem
 | | +-- GtkViewport
 | | \-- GtkWindow
 | | +-- GtkDialog
 | | \-- GtkFileSelection
 | +-- GtkBox
 | | +-- GtkHBox
 | | \-- GtkVBox
 | | +-- GtkColorSelection
 | | \-- GtkCurve
 | +-- GtkButton
 | | +-- GtkOptionMenu
 | | \-- GtkToggleButton
 | | \-- GtkCheckButton
 | | \-- GtkRadioButton
 | +-- GtkList
 | +-- GtkMenuShell
 | | +-- GtkMenu
 | | \-- GtkMenuBar
 | +-- GtkNotebook
 | +-- GtkScrolledWindow
 | +-- GtkTable
 | \-- GtkTree
 +-- GtkDrawingArea
 +-- GtkEntry
 +-- GtkMisc
 | +-- GtkArrow
 | +-- GtkImage
 | +-- GtkLabel
 | \-- GtkPixmap
 +-- GtkPreview
 +-- GtkProgressBar
 +-- GtkRange
 | +-- GtkScale
 | | +-- GtkHScale
 | | \-- GtkVScale
 | \-- GtkScrollbar
 | +-- GtkHScrollbar
 | \-- GtkVScrollbar
 +-- GtkRuler
 | +-- GtkHRuler
 | \-- GtkVRuler
 \-- GtkSeparator
 +-- GtkHSeparator
 \-- GtkVSeparator

Programmation GTK/Widgets sans fenêtre
Les widgets suivants n'ont pas de fenêtre associée. Si vous voulez capturer des événements, vous devez utiliser codice_1. Reportez-vous à la section sur Le widget "EventBox".
Nous continuerons notre exploration de GTK en examinant chaque widget tour à tour, créant quelques fonctions simples pour les afficher. Une autre source intéressante est le programme codice_23 livré avec GTK. Il se trouve dans le répertoire codice_24