web-dev-qa-db-fra.com

Que fait le «poids» dans tkinter?

J'ai cherché sur différents sites Web pour essayer de savoir quel poids fait tkinter. Je l'ai obtenu de TkDocs :

Chaque colonne et ligne a une option de grille de "poids" qui lui est associée, qui lui indique combien elle devrait augmenter s'il y a de la place supplémentaire dans le maître à remplir. Par défaut, le poids de chaque colonne ou ligne est de 0, ce qui signifie ne pas développer pour remplir l'espace.

Quelqu'un pourrait-il mettre cela dans un certain contexte pour moi, car j'ai du mal à comprendre ce qu'il fait. J'ai expérimenté le code suivant, et il semble simplement déplacer les choses sur la page lorsque je modifie les valeurs.

try:
    import tkinter
except ImportError:  # python 2
    import Tkinter as tkinter

import os

mainWindow = tkinter.Tk()

mainWindow.title("Grid demo")
mainWindow.geometry('640x480-8-200')

label = tkinter.Label(mainWindow, text="tkinter grid demo")
label.grid(row=0, column=0, columnspan=3)

mainWindow.columnconfigure(0, weight=1)
mainWindow.columnconfigure(1, weight=1)
mainWindow.columnconfigure(2, weight=3)
mainWindow.columnconfigure(3, weight=3)
mainWindow.columnconfigure(4, weight=3)
mainWindow.rowconfigure(0, weight=1)
mainWindow.rowconfigure(1, weight=10)
mainWindow.rowconfigure(2, weight=1)
mainWindow.rowconfigure(3, weight=3)
mainWindow.rowconfigure(4, weight=3)

fileList = tkinter.Listbox(mainWindow)
fileList.grid(row=1, column=0, sticky='nsew', rowspan=2)
fileList.config(border=2, relief='sunken')

for zone in os.listdir('/Windows/System32'):
    fileList.insert(tkinter.END, zone)
mainWindow.mainloop()
20
Fred

Dans les termes les plus simples possibles, un poids différent de zéro fait augmenter une ligne ou une colonne s'il y a de l'espace supplémentaire. La valeur par défaut est un poids de zéro, ce qui signifie que la colonne ne s'agrandira pas s'il y a de l'espace supplémentaire.

Considérez le code suivant, qui crée une fenêtre plus grande que les widgets qui se trouvent à l'intérieur et pour laquelle aucune colonne n'a de poids:

import tkinter as tk

root = tk.Tk()
root.geometry("200x100")

f1 = tk.Frame(root, background="bisque", width=10, height=100)
f2 = tk.Frame(root, background="pink", width=10, height=100)

f1.grid(row=0, column=0, sticky="nsew")
f2.grid(row=0, column=1, sticky="nsew")

root.grid_columnconfigure(0, weight=0)
root.grid_columnconfigure(1, weight=0)

root.mainloop()

Voici à quoi ressemble la fenêtre:

window with no weights applied

La raison pour laquelle il ressemble à cela est que tkinter a été invité à ne donner aucun espace supplémentaire aux colonnes, donc l'espace supplémentaire n'est pas utilisé à droite.

Maintenant, changez le code pour donner un poids à une seule colonne:

root.grid_columnconfigure(0, weight=1)

Lorsque nous redémarrons, nous avons maintenant une fenêtre qui ressemble à ceci:

window with weight on first column only

Qu'est-il arrivé? Parce que la colonne zéro avait un poids d'un, tkinter a donné l'espace supplémentaire à cette colonne. Vous auriez pu régler le poids à 1, 100, 100000 et vous obtiendriez le même résultat. Dans ce cas, tout l'espace supplémentaire va à cette seule colonne.

Que se passe-t-il si vous attribuez un poids aux deux colonnes? Le poids est divisé entre les colonnes proportionnellement à leur poids. Par exemple, supposons que vous vouliez une zone de navigation sur la gauche qui occupe 1/4 de l'écran et la zone principale devrait occuper 3/4 de l'écran.

Modifiez les poids pour qu'ils ressemblent à ceci:

root.grid_columnconfigure(0, weight=1)
root.grid_columnconfigure(1, weight=3)

Étant donné que les deux colonnes ont du poids, un espace supplémentaire est donné aux deux colonnes. Pour chaque quatre pixels d'espace supplémentaire, la colonne 0 obtiendra 1 et la colonne 1 obtiendra les 3 autres.

window with weight given to both columns

De plus, si vous redimensionnez la fenêtre de manière interactive, la proportion est préservée autant que possible. Voici la même fenêtre que j'ai redimensionnée manuellement pour être beaucoup plus large:

window after resizing

33
Bryan Oakley