Tkinter Button Commands In For Loop
Solution 1:
It is my understanding that e.g. i
in a lambda
within a loop like this is referring to the variable i
itself, not the value of the variable on each iteration, so that when the command
callback is called, it will use the value of i
at that moment, which as you noticed is the value on the last iteration.
One way to solve this is with a partial
. partial
will, in effect "freeze" the arguments at their current state in the loop and use those when calling the callback.
Try using a partial
instead of a lambda
like this:
from functools import partial
buttonDictionary = {}
for i inrange(0,len(currentVisitors)):
buttonDictionary[i] = Button(bottomFrame, text=currentVisitors[i], command=partial(signOut, topFrame, bottomFrame, currentVisitors[i]))
buttonDictionary[i].pack()
Another way I have seen this done, but haven't tried, is to assign i
to a new variable in your lambda
each time:
command=lambda i=i: signOut(topFrame, bottomFrame, currentVisitors[i])
I have gotten burned bad more than once when I first started with Python by using lambdas in loops (including a case very similar to this trying to assign a callback to dynamically generated buttons in a loop). I even created a snippet that would expand to think_about_it('are you sure you want to use a lambda?')
whenever I typed lambda
just to remind me of the pain I caused myself with that...
Post a Comment for "Tkinter Button Commands In For Loop"