Par la suite nous discuterons des composants graphiques - widgets, les briques de construction de la GUI de votre application. Comment organiser les widgets dans une fenêtre ?
Bien qu’il y ait différents gestionnaires de positionnement (geometry managers) dans tkinter, nous retiendrons plus spécialement le gestionnaire .grid(). Ce gestionnaire «découpe» chaque fenêtre ou cadre en une grille formée de lignes et de colonnes.
Lorsqu’on crée un widget, il n’apparaît pas jusqu’à ce qu’il soit positionné au moyen d’un gestionnaire de positionnement. Ainsi, construction et placement du widget se font en deux temps:
truc = Constructeur(parent, ...)
truc.grid(...)
où Constructeur est l’une des classes de widget comme Button, Frame, ... et parent est le widget parent dans lequel le widget enfant est construit. Tous les widgets dispose de la méthode .grid() qui s’utilise pour préciser son emplacement dans une grille.
Pour afficher un widget w sur l’écran de votre application:
Cette méthode enregistre le widget w dans le gestionnaire de grille. Si vous ne faites pas ça, votre widget existera sans pour autant apparaître à l’écran. Voici les options possibles:
Paramètres: |
|
---|
Ces méthodes relatives au placement dans une grille sont définies sur tous les widgets w:
Retourne un tuple à 4 éléments qui décrit la boîte englobante (bounding box) de tout ou partie de la grille associée au widget w. Les deux premiers nombres sont les coordonnées x et y du coin supérieur gauche de la zone, et les deux autres sa largeur et sa hauteur.
Si vous précisez les arguments column et row, la boîte englobante retournée décrit la zone de la cellule correspondante. Si vous renseignez aussi les arguments col2 et row2, la boîte englobante retournée décrit la zone du grillage qui va de la colonne column à col2 inclus et de la ligne row à row2 inclus.
Par exemple, w.grid_bbox(0, 0, 1, 1) retourne la boîte englobante de quatre cellules et non pas une.
Cette méthode fait disparaître w de l’écran. Il existe toujours, il est simplement invisible. Vous pouvez utiliser .grid() pour le faire apparaître de nouveau, mais ses options de grille auront été oubliées.
Retourne un dictionnaire dont les clés sont les noms des options de grille de w avec les valeurs correspondantes de ces options.
Étant donné des coordonnées (x, y) relatives au widget conteneur, cette méthode retourne un tuple (col, row) qui décrit quelle cellule du système de grille de w contient ces coordonnées à l’écran.
Normalement, tous les widgets propagent leurs dimensions, ce qui veut dire qu’ils s’ajustent pour s’adapter à leur contenu. Cependant, il arrive qu’on veuille forcer un widget à être d’une certaine taille indépendamment de la taille de son contenu. Pour faire cela, appeler w.grid_propagate(0) où w est le widget dont vous voulez forcer la taille.
Cette méthode ressemble à .grid_forget(), mais les options de grille ne sont pas perdues. Ainsi, si vous appellez .grid() à nouveau, les mêmes options de grilles seront utilisées.
Retourne un tuple à deux éléments qui contient le nombre de colonnes et de lignes dans le système de grille de w.
Retourne la liste des widgets gérés par w. Si aucun argument n’est fourni, la liste est exhaustive. Utilisez l’argument row= pour selectionner ceux qui se trouvent dans une ligne particulière. De même, utilisez column= pour sélectionner ceux qui se trouvent dans une colonne particulière.
Sauf à prendre certaines précautions, la largeur d’une colonne pour un certain widget sera égal à la largeur de sa plus large cellule et la hauteur d’une ligne sera égal à la hauteur de sa plus haute cellule. L’attribut sticky controle seulement son emplacement dans la cellule s’il ne la remplit pas complètement.
Si vous souhaitez controler plus finement cet ajustement automatique des colonnes et des lignes, utilisez ces méthodes sur le widget parent qui contient la grille de positionnement.
Dans la grille du widget w, configure la colonne numéro N de telle sorte que les options fournies aient les valeurs indiquées (voir plus bas).
Dans la grille du widget w, configure la ligne numéro N de telle sorte que les options fournies aient les valeurs indiquées.
Paramètres: |
|
---|
Vous souhaitez que l’utilisateur puisse redimensionner la fenêtre de l’application tout en distribuant l’espace supplémentaire entre les widgets qui la composent. Cela requiert certaines opérations qui ne sont pas évidentes.
Il est nécessaire d’utiliser les techniques de gestion de la taille des lignes et colonnes décrites dans la section précédente pour rendre votre grille étirable. Cependant, ce n’est pas suffisant.
Reprenons l’exemple de la simple application qui contenait un seul bouton. Si vous la lancez et que vous redimensionnez la taille de la fenêtre, le bouton conserve la même taille.
Voici une version où le bouton remplit toujours tout l’espace disponible:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# Chargement du module tkinter
from tkinter import * # pour Python2 se serait Tkinter
# Construction de la fenêtre principale «root»
root = Tk()
root.title('Simple exemple')
# Configuration du gestionnaire de grille
root.rowconfigure(0, weight=1)
root.columnconfigure(0, weight=1)
# Construction d'un simple bouton
qb = Button(root, text='Quitter', command=root.quit)
# Placement du bouton dans «root»
qb.grid(row=0, column=0, sticky="nsew")
# Lancement de la «boucle principale»
root.mainloop()
|
Cependant, dans la plupart des applications, les widgets sont positionnés en grille dans des cadres eux-mêmes positionnés dans la fenêtre principale. Dans cette situation, il ne faudra pas oublier de rendre étirable la grille de la fenêtre principale ainsi que les grilles des cadres.