0

Как предотвратить сжатие Frame в Tkinter под содержимое?

16

У меня возникла проблема с отображением элементов в Tkinter. Вот код, который вызывает у меня трудности:

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()

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

1 ответ(ов)

0

По умолчанию оба менеджера размещения pack и grid изменяют размер виджета в зависимости от его содержимого, что требуется, скажем так, в 99,9% случаев. Это свойство называется пропагированием геометрии. Существуют команды для включения и отключения пропагирования геометрии при использовании pack (pack_propagate) и grid (grid_propagate).

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

f.pack_propagate(0)

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

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь