New submission from alan hoover <alan.hoo...@gmail.com>:

Background:
building a screen using Tkinter based on information from a database to let 
user take action on the database rows.  I don't know how many rows there will 
be, so I'm storing the widgets in arrays for each column.

Code:
for row in getDBrows():
    self.buttons.append(Tkinter.Button(self,text='UnLoad it', command=lambda 
:self.unload(row[0])))

Problem:
When executing the above code, all the buttons have the key to the database 
table that belongs to the last row.  I found a work around -- by moving the 
call to create the button (containing the lambda) to a separate function and 
call that function to create the button instead of creating the button 
directly, the buttons then make their callback with a correct database key.

Workaround:
for row in getDBrows():
    self.buttons.append(self.buildbutton(row[0]))
.
.
def buildbutton(self,key):
    return Tkinter.Button(self,text='UnLoad it', command=lambda: 
self.unload(key))

When using the workaround code instead of the original code, the button
for each row has the appropriate key to the database.

Speculation:
It acts like the lambda definitions don't get solidified until the containing 
block exits; at that time, the lambda definition(s) get locked in with the 
current value of the variable getting passed into the lambda as a parameter.  
By moving the lambda call to a different block (separate function), the lambda 
gets "locked" when that block (function) exits instead of when the containing 
block (loop) exits.

----------
components: IDLE, Tkinter, Windows
messages: 102120
nosy: alan.hoover
severity: normal
status: open
title: series of lamdas in loop sets the paramater on all calls to that of the 
last call
type: behavior
versions: Python 2.6

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue8283>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to