Вопрос по row, python, tkinter – Установка позиции для кнопки в Python?

16

Я только что написал код, который создает окно (используя TKinter) и отображает одну рабочую кнопку.

b = Button(master, text="get", width=10, command=callback)

Но я хотел бы иметь несколько кнопок под этой.

Как установить строку и столбец кнопки? Я пытался добавитьrow = 0, column = 0, но это не сработает.

Спасибо

Ваш Ответ

3   ответа
3

Grid Geometry Manager:

btns = [
    (lambda ctl: ctl.grid(row=r, column=c) or ctl)(
        Button(text=str(1 + r * 3 + c)))
    for c in (0,1,2) for r in (0,1,2)]

результат:

[1][2][3]
[4][5][6]
[7][8][9]
@FabienAndre, исправлено! Спасибо за комментарий!
-1 Ваш код создает экземпляры кнопок, но ваша переменнаяbtns это список None ...
45

чтобы вы поместили его с помощью того, что Tkinter называет «менеджерами геометрии». Три менеджерасетка, пак а такжеместо, У каждого есть свои сильные и слабые стороны. Эти три менеджера реализованы как методы для всех виджетов.

gridКак следует из названия, идеально подходит для размещения виджетов в сетке. Вы можете указать строки и столбцы, диапазоны строк и столбцов, отступы и т. Д.

Пример:

b = Button(...)
b.grid(row=2, column=3, columnspan=2)

pack использует блочную метафору, позволяющую вам «упаковать» виджеты вдоль одной из сторон контейнера. Пакет очень хорош при полностью вертикальной или горизонтальной компоновке. Например, панели инструментов, где виджеты выровнены по горизонтали, являются хорошим местом для использования пакета.

Пример:

b = Button(...)
b.pack(side="top", fill='both', expand=True, padx=4, pady=4)`

place наименее используемый менеджер геометрии. С помощью place вы указываете точное положение x / y и ширину / высоту виджета. У него есть несколько приятных функций, таких как возможность использовать абсолютные или относительные координаты (например: вы можете разместить виджет на 10,10 или на 50% ширины или высоты виджетов).

В отличие отgrid а такжеpack, с помощьюplace не заставляет родительский виджет расширяться или сворачиваться, чтобы соответствовать всем виджетам, которые были размещены внутри.

Пример:

b = Button(...)
b.place(relx=.5, rely=.5, anchor="c")

С этими тремя менеджерами геометрии вы можете создать практически любой тип макета, который только можете себе представить.

Вот Это Да! Благодарю. очень полезно EatMyApples
Хорошо объяснил! Но как я могу использовать их все вместе?
15

MyButton1 = Button(master, text="BUTTON1", width=10, command=callback)
MyButton1.grid(row=0, column=0)

MyButton2 = Button(master, text="BUTTON2", width=10, command=callback)
MyButton2.grid(row=1, column=0)

MyButton3 = Button(master, text="BUTTON3", width=10, command=callback)
MyButton3.grid(row=2, column=0)

Нужно создать 3 ряда кнопок. Использование сетки намного лучше, чем использование пакета. Однако, если вы используете grid на одной кнопке, а pack на другой, она не будет работать, и вы получите ошибку.

Я рекомендую не отдавать предпочтение одному над другим - изучите сильные стороны каждого и используйте правильный инструмент для работы. Пакет удивительно мощный и простой для определенного класса задач макета, как и сетка. Каждый из них может легче решить некоторые проблемы, чем другие.

Похожие вопросы