11

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?

Bryan Oakley
  • 370,779
  • 53
  • 539
  • 685
simotophs23
  • 245
  • 1
  • 2
  • 8

1 Answers1

19

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)).

martineau
  • 119,623
  • 25
  • 170
  • 301
Marcin
  • 215,873
  • 14
  • 235
  • 294