Tkinter Menus
Eric Brunel
eric.brunel at pragmadev.com
Mon Dec 16 04:21:46 EST 2002
Tim Daneliuk wrote:
> Justin Shaw wrote:
> <SNIP>
>>
>>
>> This version invokes callback when the menu is created:
>> m.add_command(label='Call %s' % (label=" ...", callback(i+1))
>>
>> and so is essentially the same as
>> m.add_command(label='Call %s' % (label=" ...", None)
>>
>> as apposed to the other version which creates a lambda function at menu
>> creation time that gets called when the menu is clicked.
>
>
> Yes, that's what I suspected. But, what I'm trying to understand is
> the language semantics here: *why* do the two forms behave the way
> they do -i.e., What is it about the lambda form that defers
> execution until the time when a menu item is selected?
Because the purpose of lambda's is exactly that: create on the fly small
functions that can be used as callbacks for Tkinter's menus, buttons, or
wherever else you need to pass a function.
When you write:
lambda x: <expr using x>
it's exactly the same than writing
def f(x):
return <expr using x>
and use f.
Using a simpler example than the one we started with, the following two
codes do the same thing:
---Code 1---------------------
def myPrint(x):
print '>>>', x
...
def myCallback():
myPrint(76 + 23)
b = Button(..., command=myCallback)
b.pack()
...
------------------------------
---Code 2---------------------
def myPrint(x):
print '>>>', x
...
b = Button(..., command=lambda: myPrint(76 + 23))
b.pack()
...
------------------------------
So the evalution of myPrint(76 + 23) is deferred is the second code for
exactly the same reason than in the first one: because it's included in a
function. In the first code, the function is explicit and named myCallback;
in the second one, the function is implicitely created by the lambda.
HTH
--
- Eric Brunel <eric.brunel at pragmadev.com> -
PragmaDev : Real Time Software Development Tools - http://www.pragmadev.com
More information about the Python-list
mailing list