Python ттк кнопки. Передача аргументов в OnClick - PullRequest
1 голос
/ 10 февраля 2020

Я довольно новичок в Python и совершенно новичок в размещении сообщений на этом форуме (я использую его годами, но, как правило, получаю больше удачи в поиске ответа путем поиска в прошлых вопросах. Сегодня я в тупике ).

rows = 8
columns = 8

def onClick(args):
    print("args: ", args)

myButtons = []

myButtons = [ ttk.Button(mainframe, text=str(i) + str(j), command=lambda:onClick([int(i),int(j)])) for i in range(columns) for j in range(rows) ]

for i in range(columns) :
    for j in range(rows):
        myButtons[i*rows+j].grid(column=i, row=j)

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

Я пытаюсь вызвать событие щелчка для кнопки в сетке. Я попытался создать кнопки с разными аргументами, которые будут передаваться в событие onClick, чтобы я знал, какая кнопка была нажата. Я уверен, что это работало, когда я создавал кнопки по отдельности, а не когда я создавал их со списком. Теперь, независимо от того, какую кнопку я нажимаю, я получаю:

args: [7,7]

Может кто-нибудь указать, где я иду не так, пожалуйста?

Спасибо!

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

Вам необходимо использовать значения аргументов по умолчанию в lambda:

myButtons = [ttk.Button(mainframe, text=str(i)+str(j), command=lambda i=i,j=j: onClick([i,j])) for i in range(columns) for j in range(rows)]

Также вы можете комбинировать понимание списка и для l oop вместе:

myButtons = []
for i in range(columns):
    for j in range(rows):
        btn = ttk.Button(mainframe, text=str(i)+str(j),
                        command=lambda i=i,j=j:onClick([i,j]))
        btn.grid(column=i, row=j)
        myButtons.append(btn)
0 голосов
/ 10 февраля 2020

Небольшое изменение для захвата i & j с помощью обработчика событий:

def on_click(args):
    print("args: ", args)


def click_handler(args):
    return lambda: on_click(args)


myButtons = [ttk.Button(mainframe, text=str(i) + str(j), command=lambda: click_handler([int(i),int(j)])) for i in range(8) for j in range(8)]

# for ...
...