Поскольку ваш графический интерфейс, кажется, имеет две логические группы виджетов, я бы организовал его как таковой. Начните с размещения холста слева и кадра справа. Вы можете использовать pack
, place
, grid
или панорамное окно для управления ими. Для ориентации влево-вправо pack
является хорошим выбором из-за его простоты
Обратите внимание, что вам не обязательно это делать, но опыт научил меня, что проблемы компоновки намного проще решить.
В следующем примере я поставил expand
в False
для кнопки кадра, а это значит, что полотно будет увеличиваться и уменьшаться, когда пользователь изменяет размер (потому что он имеет expand=True
), но кнопки будут принимать только до ровно столько места, сколько им нужно.
canvas = Canvas(root, ...)
buttonframe = Frame(root, ...)
canvas.pack(side="left", fill="both", expand=True)
buttonframe.pack(side="right", fill="both", expand=False)
Далее вы можете поместить все кнопки в нужную сторону, не беспокоясь о том, как их размещение может повлиять на объекты слева.
Важная вещь, которую следует помнить при использовании grid
, состоит в том, что вам следует назначить хотя бы одну строку и по крайней мере один столбец для получения дополнительного пространства. Это может быть строка и/или столбец, содержащий виджеты, или это может быть пустая строка и столбец на ребре.
button1 = Button(buttonframe, ...)
button2 = Button(buttonframe, ...)
button3 = Button(buttonframe, ...)
...
button1.grid(row=0, column=0)
button2.grid(row=0, column=1)
button3.grid(row=1, column=0)
...
buttonframe.grid_rowconfigure(100, weight=1)
buttonframe.grid_columnconfigure(2, weight=1)
примечание: если вам нужно сохранить ссылку на виджет, необходимо создать виджет и вызвать grid
(или pack
или place
) на две отдельные линии. Это связано с тем, что Button(...).grid(...)
возвращает значение последнего вызова функции, а grid(...)
возвращает None
.
использовать 'grid (rowspan = ...)' для холста или помещать 'Frame' в правый столбец и помещать кнопки в этот кадр. – furas
BTW: 'var = Widgets(). Grid()' присваивает 'None'' var', потому что 'grid()' возвращает 'None'. Если вам понадобятся переменные, сделайте это в два этапа: «var = Widget()» и «var.grid()». – furas
'grid (rowspan = ...)' решил, спасибо @furas – JMz