Redimensionnement formulaire Tk avec Grid

La plupart des endroits qui contiennent des explications sur le fonctionnement de Tk et de son gestionnaire de géométrie « grid » vont vous donner les informations suivantes:

(Les exemples sont écrits en Python mais le principe devrait fonctionner avec n’importe quel langage supportant Tk.)

On doit utiliser « columnconfigure » et « rowconfigure » et définir un « weight » d’au moins 1 pour chaque « column » et « row » à l’intérieur du « Frame ». Donc, pour une grille 2×2:

cadre.columnconfigure(0, weight=1)
cadre.columnconfigure(1, weight=1)
cadre.rowconfigure(0, weight=1)
cadre.rowconfigure(1, weight=1)

On doit aussi utiliser l’option « sticky » pour chaque widget qui doit se coller à au moins un côté de son conteneur. Alors, si on décide de placer un bouton à l’intérieur de chaque cellule créée dans l’exemple plus haut et qu’on les fait coller sur les quatres côtés de leur cellule respective, nous aurons le code suivant:

bouton1.grid(column=0, row=0, sticky=(N,S,E,W))
bouton2.grid(column=1, row=0, sticky=(N,S,E,W))
bouton3.grid(column=0, row=1, sticky=(N,S,E,W))
bouton4.grid(column=1, row=1, sticky=(N,S,E,W))

Mais même après avoir fait tout cela, ce qui peut être relativement long pour des interfaces complexes, rien ne semble fonctionner. L’élément manquant, dont personne ne semble parler, est que le conteneur racine (« root ») doit aussi avoir un « weight » de plus de 0 pour « columnconfigure » et « rowconfigure ». Dans ce cas, tout ce que nous devons faire est d’ajouter les commandes pour la cellule (0,0) puisque le cadre s’occupe du reste des divisions de la fenêtre. Comme il est suggéré à plusieurs endroits, vous avez probablement du code semblable dans votre fichier principal:

root = Tk()
root.title("Mon application")

Cela signifie que « root » aussi doit être configuré en ajoutant les instructions suivantes:

root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)

Et maintenant, vos widgets devraient s’ajuster automatiquement selon leur configuration.
Voici le code complet de l’exemple:

#!/usr/bin/python

from tkinter import *
from tkinter import ttk

root = Tk()
root.title("Mon application")
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)

cadre = ttk.Frame(root)
cadre.columnconfigure(0, weight=1)
cadre.columnconfigure(1, weight=1)
cadre.rowconfigure(0, weight=1)
cadre.rowconfigure(1, weight=1)
cadre.grid(column=0, row=0, sticky=(N,S,E,W))

bouton1 = ttk.Button(cadre, text="Bouton1", command=lambda: print("Bouton1"))
bouton2 = ttk.Button(cadre, text="Bouton2", command=lambda: print("Bouton2"))
bouton3 = ttk.Button(cadre, text="Bouton3", command=lambda: print("Bouton3"))
bouton4 = ttk.Button(cadre, text="Bouton4", command=lambda: print("Bouton4"))
bouton1.grid(column=0, row=0, sticky=(N,S,E,W))
bouton2.grid(column=1, row=0, sticky=(N,S,E,W))
bouton3.grid(column=0, row=1, sticky=(N,S,E,W))
bouton4.grid(column=1, row=1, sticky=(N,S,E,W))

root.mainloop()

Laisser un commentaire