Tkinter geometria grade propagação tamanho gerente (com pegajoso)
Pergunta
Eu estou faltando alguma coisa sobre como tamanhos propagam em Tk. Tente isto:
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 está dentro frame1 e label2 é frame2 dentro. label1 sai mais estreito do que label2, como visto pelo fundo branco. Mas frame1 e frame2 são a mesma largura, como visto por suas fronteiras. Eu pensei que a viscosidade iria expandir label1 para ter a mesma largura como seu pai.
Se eu colocar label1 e label2 dentro do mesmo quadro, em seguida, label1 sai tão grande 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)
O que eu estou ausente? Na vida real, eu tenho alguns quadros aninhados empilhados que não estão em expansão como eu gostaria.
Obrigado, Dan
Solução
Linhas e colunas têm "peso" que descreve como eles crescem ou encolhem para preencher o espaço extra no mestre. Por padrão, uma linha ou coluna tem um peso de zero, o que significa que você disse o rótulo para preencher a coluna, mas você não disse a coluna para preencher o quadro mestre.
Para corrigir isso, dar a coluna um peso. Qualquer inteiro positivo vai fazer neste caso específico:
frame1.columnconfigure(0, weight=1)
frame2.columnconfigure(0, weight=1)
Para mais informações sobre grid
, com exemplos em rubi, TCL, perl e python, consulte a grade página em tkdocs.com
Outras dicas
Esta solução com colunas e molduras obras, mas para obter rótulos para ter a mesma largura em uma grade, você não precisa os quadros que encerram. Veja abaixo exemplo
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()