Tkinter — элементы сетки рядом друг с другом

#python #tkinter

#python #tkinter

Вопрос:

Я пытаюсь создать некоторый пользовательский интерфейс на python с помощью tkinter.

Это пример кода, который я использую:

 root = Tk()
root.geometry("1000x700x0x0")

canvas = Canvas(root, width = 700, height = 700, bg ='white').grid(row = 0, column = 0)
button1 = Button(root, text = "w/e", command = w/e).grid(row = 0, column = 1)
button2 = Button(root, text = "w/e", command = w/e).grid(row = 1, column = 1)
 

Это то, что я получаю:введите описание изображения здесь

и это то, что я хочу:введите описание изображения здесь

Любая помощь в том, как я могу это сделать?

Спасибо!

Комментарии:

1. используйте grid(rowspan=...) для холста или поместите Frame в правый столбец и поместите кнопки в этот фрейм.

2. Кстати: var = Widgets().grid() присваивается None var , потому grid() что возвращает None . Если вам понадобятся переменные, сделайте это в два этапа: var = Widget() и var.grid() .

3. grid(rowspan=...) Решаемая проблема, спасибо @furas

4. Вы должны разделить холст и кнопки на разные Frames .

Ответ №1:

Поскольку в вашем графическом интерфейсе, похоже, есть две логические группы виджетов, я бы организовал его как таковой. Начните с размещения холста слева, а рамки справа. Для управления ими можно использовать 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

Комментарии:

1. Спасибо за все ваши ответы, Брайан. Всякий раз, когда возникает вопрос о tkinter вас, кажется, всегда есть ответ!