Как остановить Tkinter Frame от сжатия, чтобы соответствовать его содержимому?

Это код, который вызывает у меня проблемы.

f = Frame(root, width=1000, bg="blue")
f.pack(fill=X, expand=True)

l = Label(f, text="hi", width=10, bg="red", fg="white")
l.pack()

Если я закомментирую строки меткой, рамка отобразится с правильной шириной. Однако добавление метки, похоже, сжимает фрейм до размера метки. Есть ли способ предотвратить это?


person Johnston    schedule 19.02.2009    source источник


Ответы (1)


По умолчанию и pack, и grid сжимают или увеличивают виджет в соответствии с его содержимым, что вы хотите в 99,9% случаев. Термин, описывающий эту функцию, - распространение геометрии. Есть команда для включения или выключения распространения геометрии при использовании pack (pack_propagate) и grid (grid_propagate).

Поскольку вы используете pack, синтаксис будет следующим:

f.pack_propagate(0)

или, может быть, root.pack_propagate(0), в зависимости от того, на какие виджеты вы действительно хотите повлиять. Однако, поскольку вы не указали высоту кадра, его высота по умолчанию составляет один пиксель, поэтому вы все равно можете не видеть внутренние виджеты. Чтобы получить полный эффект того, что вы хотите, вам нужно указать вмещающему фрейму как ширину, так и высоту.

При этом в подавляющем большинстве случаев вы должны позволить Tkinter вычислить размер. Когда вы отключите распространение геометрии, ваш графический интерфейс не будет хорошо реагировать на изменения разрешения, изменения шрифтов и т. Д. Менеджеры геометрии Tkinter (pack, place и grid) очень мощные. Вы должны научиться пользоваться этой силой, используя правильный инструмент для работы.

person Bryan Oakley    schedule 19.02.2009
comment
Это также может быть self.pack_propagate(0), если это сделано таким методом, как __init__() класса виджета, производного от Frame - как в широко используемой идиоме class Application(Frame):. - person martineau; 30.09.2012
comment
Первый пример мне не подходит. Окно имеет нужный размер, но виджеты не видны на экране. Второй пример действительно работает для меня, все отлично отображается на экране с заданной шириной / высотой! +1 - person Bas; 26.05.2015
comment
@Bas: в исходном примере высота кадра не передается и по умолчанию равна 0, поэтому, когда распространение отключено, высота остается 0, и вы не видите метку. Вам нужно будет установить высоту кадра = 20 или что-то в этом роде, чтобы увидеть метку. - person Gary02127; 22.10.2017