По умолчанию grid
не будет выделять дополнительное пространство для виджета, если не указано иное. Поскольку ваши виджеты не очень широкие, остается много неиспользуемого дополнительного пространства.
Вы можете указать сетке, что делать с дополнительным пространством, задав «вес» для строк и столбцов. Вес говорит сетке, как выделить дополнительное пространство. Хорошее практическое правило заключается в том, что вы всегда должны указывать хотя бы одну строку и один столбец для каждого виджета, который использует grid
для управления своими дочерними элементами.
В вашем конкретном случае c добавьте следующее код будет выглядеть так же, как тот, в котором вы используете pack
:
main_window.grid_rowconfigure(1, weight=1)
main_window.grid_columnconfigure(0, weight=1)
Это говорит grid
, что любое дополнительное вертикальное пространство должно быть задано в строке 1, а любое дополнительное горизонтальное пространство должно go в столбец 0
Однако , это просто быстрый взлом для иллюстрации. Я предполагаю, что вы захотите поместить другие виджеты в большое пустое пространство. Если это так, я думаю, что лучшим решением было бы придать весь вес строке 1 и столбцу 1. Затем убедитесь, что желтой рамке написано, что она охватывает два столбца. Я также рекомендую почти всегда, чтобы виджеты были «липкими» со всех сторон. В противном случае вы можете получить пробел, который вам не нужен.
frame_top.grid(row=0, column=0, sticky="nsew", columnspan=2)
frame_left.grid(row=1, column=0, sticky="nsew")
main_window.grid_rowconfigure(1, weight=1)
main_window.grid_columnconfigure(1, weight=1)
Следующим шагом будет размещение фрейма в строке 1, столбце 1. Затем вы можете добавить виджеты в этот фрейм, не затрагивая основной макет - внутри фрейма вы можете использовать pack
или grid
и этот макет будет независим от макета в окне в целом.