Родительская рамка Tkinter, кажется, сжимается внутри кнопки - PullRequest
1 голос
/ 03 апреля 2020

Я пытаюсь отобразить кнопку внутри фрейма (которая будет содержать другие кнопки). Окно root, в которое я помещу этот фрейм, должно быть организовано как сетка (будет больше виджетов), но фрейм должен быть организован с помощью pack (). Моя цель - заполнить рамку ячейкой сетки, которой она назначена, и отобразить кнопку внутри этого кадра.

Однако, когда я запускаю эту программу, кажется, что рамка исчезает или сжимается внутри кнопки.

Как сделать так, чтобы рамка сохраняла свои первоначальные размеры с помощью кнопки внутри?

from tkinter import *

root = Tk()
root.geometry('300x300')

frame=Frame(root, bg="green", width=150, height=150)
frame.grid(row=0, column=0)

Breset=Button(frame,text='Reset', bg='pink')
Breset.pack()

root.mainloop()

1 Ответ

2 голосов
/ 03 апреля 2020

Как сделать так, чтобы рамка сохраняла свои исходные размеры с помощью кнопки внутри?

Вы почти никогда не захотите этого делать. Если вы добавляете в него больше виджетов, рамка, естественно, подберет нужный размер для всего.

Если вместо этого вы хотите, чтобы рамка заполняла окно, вы могли бы сделать это, используя различные опции 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 выполнил всю работу по определению размера виджетов.

...