Propagazione dimensione gestore geometria griglia Tkinter (con sticky)
Domanda
Mi manca qualcosa su come le dimensioni si propagano in Tk. Prova questo:
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()
label1 è all'interno di frame1 e label2 è all'interno di frame2. label1 risulta più stretto di label2, come si vede dallo sfondo bianco. Ma frame1 e frame2 hanno la stessa larghezza, visti dai loro bordi. Ho pensato che la viscosità avrebbe espanso label1 per avere la stessa larghezza del suo genitore.
Se inserisco label1 ed label2 all'interno dello stesso frame, allora label1 risulta largo quanto 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)
Cosa mi sto perdendo? Nella vita reale, ho alcuni frame nidificati sovrapposti che non si espandono come vorrei.
Grazie, Dan
Soluzione
Le righe e le colonne hanno "peso" che descrive come crescono o si restringono per riempire lo spazio extra nel master. Per impostazione predefinita, una riga o una colonna ha un peso pari a zero, il che significa che hai detto all'etichetta di riempire la colonna ma non hai detto alla colonna di riempire il frame principale.
Per risolvere questo problema, assegna un peso alla colonna. Qualsiasi numero intero positivo farà in questo caso specifico:
frame1.columnconfigure(0, weight=1)
frame2.columnconfigure(0, weight=1)
Per ulteriori informazioni su grid
, con esempi in ruby, tcl, perl e python, vedere la pagina della griglia su tkdocs.com
Altri suggerimenti
Questa soluzione con colonne e frame funziona, ma per ottenere etichette con la stessa larghezza in una griglia, non sono necessari i frame inclusi. Vedi l'esempio seguente
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()