Как сделать так, чтобы рамка сохраняла свои исходные размеры с помощью кнопки внутри?
Вы почти никогда не захотите этого делать. Если вы добавляете в него больше виджетов, рамка, естественно, подберет нужный размер для всего.
Если вместо этого вы хотите, чтобы рамка заполняла окно, вы могли бы сделать это, используя различные опции grid
. Хотя, если вы хотите, чтобы рамка всегда заполняла все окно, это проще сделать с pack
, чем с grid
.
Решение с пакетом
Чтобы получить frame
для заполнения в окне root, просто используйте опции fill
и expand
с pack
:
frame.pack(fill="both", expand=True)
Решение с сеткой
Использование grid
требует еще пары шагов. Во-первых, вам нужно использовать параметр sticky
, чтобы фрейм занимал место, которое он выделил. Далее необходимо указать grid
, чтобы освободить место для кадра.
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)
frame.grid(row=0, column=0, sticky="nsew")
Отключение автоматического c изменения размера рамки
То, что вы изначально просили, называется распространение геометрии - это функция, при которой размер дети размножаются до родителя. Вы можете отключить его с помощью grid_propagate
или pack_propagate
, в зависимости от того, что вы используете для дочерних виджетов. В вашем случае вы используете pack
для кнопки внутри рамки:
frame.pack_propagate(False)
Это почти всегда худшее из трех решений. Весь смысл менеджеров геометрии pack
и grid
состоит в том, чтобы tkinter выполнил всю работу по определению размера виджетов.