12

I want to make 5 buttons in a loop, and for each buttons bind a commend to print the index. In the following solution it always prints the same index.

My code like this:

for i in range(5):
    make_button = Tkinter.Button(frame, text ="make!", 
                                 command= lambda: makeId(i))

def makeId(i):
    print(i)

It always prints 5. How can I fix this?

1
  • Wouldn't this always print '4'? Commented Oct 5, 2023 at 11:47

1 Answer 1

20

Resolution of variables in lambdas is done when lambda is executed. At this time, for all buttons i=5. To rectify this issue do as follows:

 make_button = Tkinter.Button(frame, text ="make!", 
                              command= lambda i=i: makeId(i))

This creates i as a local variable in a lambda. This local variable will hold correct value of i from the loop. the local variable can have any name, not necessarily i, e.g. command= lambda a=i: makeId(a)).

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.