#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=...)
Решаемая проблема, спасибо @furas4. Вы должны разделить холст и кнопки на разные
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
вас, кажется, всегда есть ответ!