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