Как предотвратить сжатие Frame в Tkinter под содержимое?
У меня возникла проблема с отображением элементов в 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 ответ(ов)
По умолчанию оба менеджера размещения 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
) обладают потрясающей мощью. Вам следует научиться использовать эту мощь, применяя правильный инструмент для конкретной задачи.
Цветовая палитра для Tkinter и Tix
Как изменить цвет фона или текста кнопки Tkinter на Mac OS X?
Как изменить порядок столбцов в DataFrame?
'pip' не распознан как командa внутреннего или внешнего формата
Почему statistics.mean() работает так медленно?