Как вы динамически назначаете списку кнопок одну и ту же функцию, но разные аргументы? - PullRequest
0 голосов
/ 12 января 2020

У меня есть программа python, использующая Tkinter, которая динамически создает кнопки, которые идентичны, за исключением их позиции / индекса. Кнопки создаются через al oop и сохраняются в списке. Поэтому кнопки можно идентифицировать только по индексу в списке.

Я пытаюсь позже просмотреть этот список и назначить кнопкам функцию, единственным аргументом которой является индексированная позиция этой кнопки в списке. Например:

for i in range(len(button_list)):
button_list[i].config(command=lambda: start_time(button_list[i]))

Поскольку аргумент назначается при нажатии кнопки, а не при назначении функции кнопке, нажатие любой кнопки всегда активирует функцию конечной кнопки вместо ее собственной функции. .

Есть ли способ назначить аргумент функции, когда функция назначена кнопке?

Вот окно с кнопками: Окно с кнопками

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

button_list[0].config(command=lambda: start_time(0))
button_list[1].config(command=lambda: start_time(1))
button_list[2].config(command=lambda: start_time(2))

Я также пробовал это:

index_list = list(range(len(button_list)))
for x in index_list:
    onclick = lambda index=x: start_time(x)
    button_list[x].config(command=onclick)

Любая помощь будет быть оцененным Спасибо

РЕДАКТИРОВАТЬ: Вот еще немного моего кода, чтобы дать больше контекста для ясности:

def start_time(index):
now_local = datetime.now()
hour = now_local.strftime("%H")
minute = now_local.strftime("%M")
second = now_local.strftime("%S")

global time_start
time_start = [hour, minute, second]

global button_list
button_list[index].config(text="Stop", command=lambda: end_time(index))

    for i in range(len(button_list)):
    if i == index:
        continue
    else:
        button_list[i].config(state=DISABLED)

1 Ответ

0 голосов
/ 12 января 2020

Я не на 100% уверен, что вы спрашиваете, но если я вас правильно понял, вы хотите присвоить индекс списка кнопок для start(time) в файле конфигурации для этой индексированной кнопки.

Если я правильно понимаю, вы можете использовать enumerate() для решения проблемы:

for ind, button in enumerate(button_list):
    button_list[ind].config(command= lambda: start_time(ind)
...