Méthode grid
Présentation de la stratégie grid
Cette stratégie permet de positionner chacun de vos widgets dans une ou plusieurs cellules d'une grille. La grille est organisée en lignes et en colonnes : vous pouvez, bien entendu, contrôler le nombre de lignes et de colonnes. Il est aussi à noter qu'il est possible qu'un widget occupe plusieurs cellules de la grille. Voici une capture d'écran montrant une grille un peu sophistiquée.

Mise en oeuvre d'une grille simple
Nous allons commencer par un exemple très simple. Nous allons chercher à afficher 4 boutons (2 lignes et 2 colonnes) dans la fenêtre. Voici le code à produire pour réaliser cela.
|
1 |
#!/usr/bin/python3 |
Une première grille très basique (2 lignes et 2 colonnes).
la méthode grid est disponible sur n'importe quel widget. Mais en réalité, c'est la classe Grid qui porte cette méthode et par le jeu subtil de l'héritage cette méthode est transmise à toutes les classes de widgets.
Et voici le résultat obtenu en exécutant ce programme.

Comme vous le constater, par défaut, la grille ne cherche pas à occuper 100% de la superficie de la fenêtre. Nous allons tenter de remédier à ce point. Pour cela, il faut indiquer à Tkinter les dimensions de la grille : nombre de lignes et nombre de colonnes. On réalise cela en invoquant les méthodes grid_rowconfigure et grid_columnconfigure.
Afin qu'une colonne (ou une ligne) ne prenne pas l'avantage sur une autre, il est nécessaire de jouer avec la notion de poids (weight). Dans l'exemple suivant, toutes les lignes ont le même poids (1) et idem pour les colonnes. N'oubliez pas qu'en Python, les indices commencent souvent à 0.
|
1 |
#!/usr/bin/python3 |
La grille s'étend sur toute la fenêtre.
Et voici l'affichage produit par l'exemple ci-dessus.

Par défaut, un widget occupe le minimum de place dans sa cellule et il est centré en plein milieu de cette cellule. On peut changer cela grâce au paramètre sticky. Ce paramètre doit contenir une chaîne de caractères composée des caractères n, s, e et w. Ces caractères correspondent au quatre points cardinaux (north, south, east et west).
Selon la valeur du paramètre sticky, le widget sera attaché sur un ou plusieurs côtés de la cellule qui lui est associée. Ainsi, la valeur sticky="n" collera le widget au nord de la cellule. De même, la valeur sticky="w" collera le widget à l'ouest de la cellule.
Plus subtil, la valeur sticky="we" attachera le widget à l'ouest et à l'est de la cellule : il prendra donc toute la largeur de la cellule. La valeur sticky="ns" permettra au widget de prendre toute la hauteur. Enfin, la valeur sticky="nsew" lui permettra de prendre toute la place disponible dans la cellule. Voici un exemple d'utilisation.
|
1 |
#!/usr/bin/python3 |
Utilisation du paramètre sticky
l'ordre des caractères dans une chaîne sticky n'a aucune importance. Vous pouvez l'écrire comme vous le souhaitez. Le paramètre sticky="nsew" aura donc le même effet que le paramètre sticky="wens".
Et voici l'affichage produit par cet exemple.

Peaufinons notre grille
Nous allons maintenant chercher à peaufiner notre grille. Pour ce faire, chaque bouton va recevoir le paramètre sticky="nsew" comme vu précédemment, mais nous allons aussi y rajouter des marges autour de chaque bouton. Les paramètres padx et pady permettent justement de contrôler ces marges.
Dans le même ordre d'idée, nous allons aussi chercher à décorer nos boutons. Voici un petit exemple d'utilisation.
|
1 |
#!/usr/bin/python3 |
On peaufine un peu le look
Voici le résultat produit par cet exemple de code.

Comme vous le constatez, le look commence à prendre une part importante du code, des paramètres étant souvent répliqués sur tous les appels de méthodes (constructeur ou la méthode grid, dans notre exemple).
Il est possible de simplifier ce code en déclarant les valeurs des paramètres communs dans un dictionnaire puis de repasser ce dictionnaire à chaque appel. Ainsi, si vous voulez changer les marges de vos boutons ou les couleurs, un seul endroit dans le code devra être impacté. Voici déjà un petit exemple de code et quelques explications suivront.
|
1 |
#!/usr/bin/python3 |
On rend le code plus facile à maintenir
La syntaxe **button_dict permet d'injecter les valeurs du dictionnaire dans l'appel du constructeur (ou d'une méthode). Cela est possible, car le constructeur de la classe Button accepte un nombre variable de paramètres nommés. Il en va de même pour la méthode grid. J'en ai profité pour rajouter une police de caractères pour les quatre boutons.
L'exemple de la calculatrice
Afin de terminer sur un exemple un peu plus sérieux, je voulais vous proposer le code permettant d'afficher la calculatrice présentée au début de ce chapitre. Si l'idée vous en dit, vous pouvez d'abord remonter en haut de la page pour voir le visuel shouhaité et vous pouvez essayer de réaliser cette calculatrice par vous-même. Ensuite vous pourrez jeter un coup d'oeil à ma proposition ci-dessous ;-)
il est important de comprendre que l'exemple proposé ne prend en charge que l'affichage de la calculatrice et non pas la gestion des événements. Il vous appartient de terminer cette partie si vous souhaiter obtenir une calculatrice fonctionnelle. Cela fera aussi un très bon exercice ;-)
|
1 |
#!/usr/bin/python3 |
Un exemple un peu plus sérieux d'utilisation d'une grille : la calculatrice.
l'opérateur |, utilisé en ligne 34, sert à fusionner deux dictionnaires. Cet opérateur est disponible sur les dictionnaires depuis la version 3.9 de Python. Si vous utilisez une version antérieure, veuillez adapter le code.

pensez à retailler la fenêtre afin de voir la grille se réorganiser.
Créé avec HelpNDoc Personal Edition: Rendez votre documentation accessible sur n'importe quel appareil avec HelpNDoc