[Tkinter] messed callbacks

Giacomo Boffi giacomo.boffi at polimi.it
Wed Sep 9 08:11:18 EDT 2009


"Diez B. Roggisch" <deets at nospam.web.de> writes:

> Giacomo Boffi wrote:
>
>> def doit(fr,lst):
>>   for c1,c2 in zip(lst[::2], lst[1::2]):
>>     subframe=Frame(fr)
>>     Label(subframe,text=c1+' <->
>>     '+c2).pack(side='left',expand=1,fill='both')
>>     Button(subframe,text='>',command=lambda: output(c1+'->'+c2)).pack()
>>     Button(subframe,text='<',command=lambda: output(c2+'->'+c1)).pack()
>>     subframe.pack(fill='x',expand=1)
>> 
>> why the messed callbacks? what's the right thing to do?
>
> Closures in python contain names, not the objects they refer to. So
> when you rebind that name (as you do above in your loop),

sorry, i'm not conscient of rebinding a name... what do you mean by
"rebind that name" exactly?

> the created callbacks will only refer to the last bound value of a
> name.
> 
> Create new closures, or bind arguments as defaults:
>
> funcs = []
>
> def create_func(i):
>     return lambda: i
>
> for i in xrange(10):
>     funcs.append(lambda i=i: i)
>     funcs.append(create_func(i))
>
> for f in funcs:
>     print f()

i tried to understand, and maybe i have understood a thing or two...

funcs = []

def create_func(i):
    return lambda: i

for i in xrange(10):
    funcs.append(lambda i=i: i)
    funcs.append(create_func(i))
    funcs.append(lambda: i)            # this is my addition

for f in funcs:
    print f()

ok, i'll try again following your advice

thank you very much
                                                        g
-- 
"It will be rain tonight."
            "Let it come down."



More information about the Python-list mailing list