Propagación de tamaño del administrador de geometría de cuadrícula Tkinter (con adhesivo)
Pregunta
Me falta algo sobre cómo se propagan los tamaños en Tk. Prueba esto:
from Tkinter import *
root = Tk()
frame1 = Frame(root, border=4, relief=RIDGE)
frame1.grid(sticky=E+W)
frame2 = Frame(root, border=4, relief=RIDGE)
frame2.grid(sticky=E+W)
label1 = Label(frame1, text='short', background='white')
label1.grid(sticky=E+W)
label2 = Label(frame2, text='quite a bit longer', background='white')
label2.grid(sticky=E+W)
root.mainloop()
etiqueta1 está dentro del marco1, y etiqueta2 está dentro del marco2. label1 sale más angosto que label2, como se ve en el fondo blanco. Pero frame1 y frame2 tienen el mismo ancho, como se ve por sus bordes. Pensé que la adherencia expandiría label1 para tener el mismo ancho que su padre.
Si pongo label1 y label2 dentro del mismo marco, entonces label1 sale tan ancho como label2:
frame1 = Frame(root, border=4, relief=RIDGE)
frame1.grid(sticky=E+W)
label1 = Label(frame1, text='short', background='white')
label1.grid(sticky=E+W)
label2 = Label(frame1, text='quite a bit longer', background='white')
label2.grid(sticky=E+W)
¿Qué me estoy perdiendo? En la vida real, tengo algunos marcos anidados apilados que no se expanden como me gustaría.
Gracias Dan
Solución
Las filas y columnas tienen " peso " que describe cómo crecen o se reducen para llenar espacio adicional en el maestro. Por defecto, una fila o columna tiene un peso de cero, lo que significa que le ha dicho a la etiqueta que llene la columna pero no le ha dicho a la columna que llene el marco maestro.
Para solucionar esto, asigne un peso a la columna. Cualquier número entero positivo hará en este caso específico:
frame1.columnconfigure(0, weight=1)
frame2.columnconfigure(0, weight=1)
Para obtener más información sobre grid
, con ejemplos en ruby, tcl, perl y python, consulte la página de cuadrícula en tkdocs.com
Otros consejos
Esta solución con columnas y marcos funciona, pero para que las etiquetas tengan el mismo ancho en una cuadrícula, no necesita los marcos adjuntos. Vea el ejemplo a continuación
from tkinter import *
root = Tk()
label1 = Label(root, text='short', bg='light green', relief=RIDGE)
label1.grid(sticky=E+W)
label2 = Label(root, text='quite a bit longer', bg='light green', relief=RIDGE)
label2.grid(sticky=E+W)
root.mainloop()