Используйте список кнопок. Вы можете ссылаться на индекс в лямбда-команде.
Используя список для хранения наших кнопок, мы можем ссылаться на их индекс, чтобы делать все, что нам нужно. это очень полезно при динамической работе с виджетами или при их большом количестве. Таким образом, мы можем построить простую функцию для получения индекса списка, чтобы редактировать то, что нам нужно. Лямбда хороша для настройки наших команд для каждой кнопки в цикле.
Важно отметить, что вы не можете просто выполнить command= update_button(x)
, так как это вызовет функцию, экземпляр которой кнопка создана, а не ожидаетдля вас, чтобы нажать его. Это потому, что в команде мы вызывали функцию вместо сохранения ссылки на нее. Чтобы сохранить ссылку на функцию, мы просто опускаем круглые скобки, такие как command= update_button
.
. Тем не менее, в этой ситуации нам действительно нужно передать переменную, чтобы сделать это, мы можем написатьбезымянная функция, называемая lambda
для нашей команды, чтобы выполнить другую команду и одновременно передать переменную.
import tkinter as tk
def update_button(ndex):
button_list[ndex].config(text='x')
root = tk.Tk()
button_list = []
for i in range(9):
button_list.append(tk.Button(root, text='Button {}'.format(i), command=lambda x=i: update_button(x)))
button_list[-1].pack(fill='x')
root.mainloop()
Приложение результатов, в котором были нажаты несколько кнопок:

Вот пример использования сетки с некоторой математикой для обработки размещения сетки в столбцах и строках.
import tkinter as tk
def update_button(ndex):
button_list[ndex].config(text='x')
root = tk.Tk()
button_list = []
row = 0
column = 0
for i in range(15):
button_list.append(tk.Button(root, text='Button {}'.format(i+1), command=lambda x=i: update_button(x)))
button_list[-1].grid(row=row, column=column, sticky='ew')
if row % 4 == 0 and row != 0:
column += 1
row = 0
else:
row += 1
root.mainloop()
Результаты:

Если вы предпочитаете сначала запускать столбцы, то строки просто переворачивают математику:
if column % 4 == 0 and column != 0:
row += 1
column = 0
else:
column += 1
Результаты:
