tkinter button commands with lambda in Python

lambda, list, python, python-3.x, tkinter

Solution

You can fix this problem by creating a closure for `i` and `j` with the creation of each lambda:

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

You could also create a callback factory with references to the button objects themselves:

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

And then in your initialization code:

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)

Problem

ive tried searching for a solution but couldn't find one that works. I have a 2d list of tkinter Buttons, and i want to change their Text when it is clicked by the mouse. I tried doing this: ``` 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() ``` Then when it is clicked it calls this function: ``` def update_binary_text(first,second): print(first,second) buttonList[first][second]["text"] = "1" ``` When i click a button, it simply does nothing, i had the program display the indexes of the button that was clicked, and they ALL show 4, 4 (this is when the variable number=5) Is there an solution to this? this is my first python attempt for a class. Thanks

Original source

Related problems