¿Qué hace el ‘peso’ en tkinter?

He estado buscando en diferentes sitios web tratando de averiguar qué peso tiene en tkinter. Conseguí esto de TkDocs :

Cada columna y fila tiene una opción de cuadrícula de “peso” asociada con ella, que le dice cuánto debe crecer si hay espacio adicional en el maestro para rellenar. De forma predeterminada, el peso de cada columna o fila es 0, lo que significa que no se expande para llenar el espacio.

¿Podría alguien poner esto en algún contexto para mí, ya que estoy luchando por entender lo que hace? He experimentado con el siguiente código, y parece que se mueven las cosas a través de la página cuando cambio los valores.

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() 

En los términos más simples posibles, un peso distinto de cero hace que una fila o columna crezca si hay espacio adicional. El valor predeterminado es un peso de cero, lo que significa que la columna no crecerá si hay espacio adicional.

Considere el siguiente código, que crea una ventana más grande que los widgets que están dentro, y para los cuales ninguna columna tiene peso:

 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() 

Así es como se ve la ventana:

ventana sin pesos aplicados

La razón por la que se ve así es porque se le ha dicho a tkinter que no le dé a ninguna de las columnas ningún espacio adicional, por lo que el espacio adicional no se utiliza a la derecha.

Ahora, cambie el código para que le demos peso a una sola columna:

 root.grid_columnconfigure(0, weight=1) 

Cuando reiniciamos, ahora tenemos una ventana que se ve así:

Ventana con peso solo en la primera columna

¿Que pasó? Debido a que la columna cero tenía un peso de uno, tkinter le dio el espacio adicional a esta columna. Podría haber establecido el peso en 1, 100, 100000 y obtendría el mismo resultado. En este caso, todo el espacio adicional va a esta columna.

¿Qué pasa si le das un peso a ambas columnas? El peso se divide entre las columnas proporcionales a su peso. Por ejemplo, supongamos que desea un área de navegación a la izquierda que ocupe 1/4 de la pantalla y el área principal debería ocupar 3/4 de la pantalla.

Cambia los pesos para que se vean así:

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

Como ambas columnas tienen peso, se le da espacio adicional a ambas columnas. Por cada cuatro píxeles de espacio adicional, la columna 0 obtendrá 1 y la columna 1 obtendrá los otros 3.

Ventana con peso dado a ambas columnas.

Además, si cambia el tamaño de la ventana de forma interactiva, la proporción se conserva tanto como sea posible. Aquí está la misma ventana que manualmente redimensioné para ser mucho más ancha:

ventana después de cambiar el tamaño