Команды кнопки tkinter с lambda в Python

ive попытался найти решение, но не смог найти тот, который работает. У меня есть 2d-список кнопок tkinter, и я хочу изменить их текст при щелчке мышью. Я попытался сделать это:

def create_board(number): print(number) for i in range (0,number): buttonList.append([]) for j in range(0,number): print(i,j) buttonList[i].append(Button(root, text = " ", command = lambda: update_binary_text(i,j))) buttonList[i][j].pack() 

Затем, когда его щелкают, он вызывает эту функцию:

 def update_binary_text(first,second): print(first,second) buttonList[first][second]["text"] = "1" 

Когда я нажимаю кнопку, она просто ничего не делает, у меня была программа, показывающая индексы нажатой кнопки, и они ВСЕ показывают 4, 4 (это когда число переменных = 5) Есть ли решение для этого?
это моя первая попытка python для класса.

благодаря

  • Запуск matplotlib в tkinter
  • Центрирование и размер окна кадра в Python класса Tkinter
  • Прозрачность изображения Tkinter
  • Python Tkinker - показывает jpg как метод класса, который не работает
  • Текст в поле ввода очищается при нажатии Tkinter
  • Ошибка Python: не удалось прочитать из RWops
  • Пользовательский кадр Tkinter не работает
  • Инерциальная прокрутка в Mac OS X с Tkinter и Python
  • 2 Solutions collect form web for “Команды кнопки tkinter с lambda в Python”

    Вы можете исправить эту проблему, создав закрытие для i и j с созданием каждой лямбда:

     command = lambda i=i, j=j: update_binary_text(i, j) 

    Вы также можете создать фабрику обратного вызова со ссылками на сами объекты кнопки:

     def callback_factory(button): return lambda: button["text"] = "1" 

    А затем в вашем коде инициализации:

     for j in range(0, number): new_button = Button(root, text=" ") new_button.configure(command=callback_factory(new_button)) new_button.pack() buttonList.append(new_button) 

    Всякий раз, когда мне нужна коллекция похожих виджетов, я считаю, что проще всего заключить их в объект и передать связанный метод как обратный вызов, а не играть в трюки с лямбдой. Итак, вместо списка, например buttonList[] с виджетами, создайте объект:

     class MyButton(object): def __init__(self, i, j): self.i = i self.j = j self.button = Button(..., command = self.callback) def callback(self): . . . 

    Теперь у вас есть список buttonList[] этих объектов, а не сами виджеты. Чтобы обновить текст, либо предоставите метод для этого, либо напрямую buttonList[i].button.configure(. . .) к элементу: buttonList[i].button.configure(. . .) Когда активируется обратный вызов, у него есть весь объект и любые атрибуты, которые могут вам понадобиться в self .

    Python - лучший язык программирования в мире.