2016-10-17 2 views
2

Я пытаюсь сделать некоторый интерфейс в python с tkinter.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) 

Это то, что я получаю: enter image description here

и это то, что я хочу: enter image description here

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

Спасибо!

+1

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

+1

BTW: 'var = Widgets(). Grid()' присваивает 'None'' var', потому что 'grid()' возвращает 'None'. Если вам понадобятся переменные, сделайте это в два этапа: «var = Widget()» и «var.grid()». – furas

+0

'grid (rowspan = ...)' решил, спасибо @furas – JMz

ответ

3

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

Смежные вопросы