Мне что-то не хватает о том, как размеры распространяются в Tk. Попробуй это:

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 находится внутри frame1, а label2 находится внутри frame2. label1 оказывается уже, чем label2, что видно на белом фоне. Но frame1 и frame2 имеют одинаковую ширину, как видно по их границам. Я думал, что липкость расширит label1 до той же ширины, что и его родительский элемент.

Если я помещаю метки label1 и label2 в один и тот же фрейм, тогда ширина label1 будет равна ширине 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)

Что мне не хватает? В реальной жизни у меня есть несколько уложенных друг на друга вложенных фреймов, которые не расширяются так, как мне хотелось бы.

Спасибо, Дэн

8
Dan Halbert 18 Сен 2009 в 00:25

2 ответа

Лучший ответ

Строки и столбцы имеют «вес», который описывает, как они растут или сжимаются, чтобы заполнить дополнительное пространство в шаблоне. По умолчанию строка или столбец имеет нулевой вес, что означает, что вы сказали метке заполнить столбец, но вы не сказали столбцу заполнить главный фрейм.

Чтобы исправить это, придайте столбцу вес. В этом конкретном случае подойдет любое положительное целое число:

frame1.columnconfigure(0, weight=1)
frame2.columnconfigure(0, weight=1)

Для получения дополнительной информации о grid с примерами на ruby, tcl, perl и python см. страница сетки на tkdocs.com

9
Matt Fenwick 13 Апр 2012 в 06:39
Спасибо. В реальной программе я пытался добавить веса, но без видимого эффекта. Я вернусь и проверю, что добавляю их в правильные кадры.
 – 
Dan Halbert
18 Сен 2009 в 01:07

Это решение со столбцами и фреймами работает, но чтобы надписи имели одинаковую ширину в сетке, вам не нужны закрывающие фреймы. См. Пример ниже

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()
0
Paulus 26 Июн 2018 в 15:06