Как я могу поставить 2 кнопки рядом друг с другом? - PullRequest
6 голосов
/ 14 февраля 2010
b = Button(root, text="Enter", width=10, height=2, command=button1)
b.config()
b.pack(side=LEFT)

c = Button(root, text="Clear", width=10, height=2, command=clear)
c.pack(side=LEFT)


scrollbar = Scrollbar(root)
scrollbar.pack(side=RIGHT, fill=Y)
text.config(width=35, height=15)
text.pack(side=RIGHT, fill=Y)
scrollbar.config(command=text.yview)
text.config(yscrollcommand=scrollbar.set)

Как я могу поместить эти 2 кнопки рядом друг с другом поверх текстового виджета? когда я устанавливаю "side = LEFT", он просто помещает 2 кнопки рядом с виджетом текста

1 Ответ

15 голосов
/ 14 февраля 2010

Как правило, есть два решения этой проблемы. Ни один не лучше, чем другие при любых обстоятельствах, или в этом конкретном примере. Оба решения вполне приемлемы.

Решение 1: использовать два контейнера (как правило, кадры). Один для горизонтальных предметов, другой для вертикальных. В этом случае корневое окно может служить контейнером для вертикально уложенных элементов. Поместите две кнопки в горизонтальную рамку (используя pack (side = LEFT)), затем поместите эту рамку над текстовым виджетом (используя pack (side = TOP)).

Решение 2: используйте менеджер геометрии сетки, который размещает ваш пользовательский интерфейс в сетке. Поместите кнопки в ячейки 0,1 и 0,2, а текстовый виджет в 1,1, охватывающий два столбца.

Как правило, использование сетки требует более предварительного планирования. Вы должны выяснить, какие элементы должны охватывать столбцы или строки, какие столбцы или строки должны увеличиваться и уменьшаться при изменении размера виджета и т. Д. Пакетное решение является «самым простым» (в любом случае, для некоторых определений «легкий») для очень простых макетов, таких как этот.

Общая техника использования фреймов для хранения групп виджетов является хорошей. Это позволяет легко управлять целыми наборами виджетов как группой. и смешивать и сопоставлять группы виджетов слева направо и группы виджетов сверху вниз.

Вот как бы я это сделал, используя технику многокадрового изображения. Обратите внимание, как я создаю виджеты как дочерние элементы root, а не дочерние элементы внутренних фреймов. Это немного упрощает изменение макета в будущем, поскольку все, что вам нужно сделать, это создать или удалить различные кадры без необходимости изменять иерархию виджетов.

# create the main sections of the layout, 
# and lay them out
top = Frame(root)
bottom = Frame(root)
top.pack(side=TOP)
bottom.pack(side=BOTTOM, fill=BOTH, expand=True)

# create the widgets for the top part of the GUI,
# and lay them out
b = Button(root, text="Enter", width=10, height=2, command=button1)
c = Button(root, text="Clear", width=10, height=2, command=clear)
b.pack(in_=top, side=LEFT)
c.pack(in_=top, side=LEFT)

# create the widgets for the bottom part of the GUI,
# and lay them out
text = Text(root, width=35, height=15)
scrollbar = Scrollbar(root)
scrollbar.config(command=text.yview)
text.config(yscrollcommand=scrollbar.set)
scrollbar.pack(in_=bottom, side=RIGHT, fill=Y)
text.pack(in_=bottom, side=LEFT, fill=BOTH, expand=True)

Наивная реализация с использованием сетки приведена ниже. У него другое поведение при изменении размера, которое может соответствовать вашим ожиданиям. Это действительно зависит от желаемого размера. Обычно я управляю рядом элементов управления с помощью рамки, а затем использую сетку, чтобы выложить ее вместе с другими виджетами. В этом примере я просто буду использовать сетку для всего.

Обратите внимание, что помимо управления тем, в каких строках и столбцах находится виджет, вы должны принять решение о весовом коэффициенте для строк и столбцов. Как минимум, вам нужно выбрать одну строку и один столбец, чтобы «убрать провисание», что обычно означает, в каком столбце находится ваш основной виджет (читай: обычно текст, холст или другой фрейм).

b = Button(root, text="Enter", width=10, height=2, command=button1)
c = Button(root, text="Clear", width=10, height=2, command=clear)
b.grid(row=0,column=0, sticky=W)
c.grid(row=0,column=1, sticky=W)

textframe = Frame(root)
textframe.grid(in_=root, row=1, column=0, columnspan=3, sticky=NSEW)
root.columnconfigure(0, weight=1)
root.rowconfigure(1, weight=1)

text = Text(root, width=35, height=15)
scrollbar = Scrollbar(root)
scrollbar.config(command=text.yview)
text.config(yscrollcommand=scrollbar.set)
scrollbar.pack(in_=textframe, side=RIGHT, fill=Y)
text.pack(in_=textframe, side=LEFT, fill=BOTH, expand=True)

В этом конкретном случае я бы выбрал первый метод, с пакетом. Для более сложных дизайнов я почти всегда буду использовать сочетание сетки и упаковки. Используйте упаковку для элементов, которые естественным образом складываются горизонтально или вертикально (например, панели инструментов). Используйте сетку для более сложных макетов (таких как все приложение, виджеты с полосами прокрутки, диалоговые окна и т. Д.). Вы не можете использовать сетку и упаковку для одного контейнера, но вы можете использовать упаковку для одного контейнера, сетку для другого и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...