Tkinter Newbie Question
Marc 'BlackJack' Rintsch
bj_666 at gmx.net
Fri Dec 7 02:20:12 EST 2007
On Thu, 06 Dec 2007 23:04:56 -0800, robbie wrote:
> This second example doesn't work. The only difference is that I gave
> the salutation function a parameter and tried to pass a string as the
> parameter from the button. It appears to call the function once for
> each window as they're being created, but doesn't do anything when the
> buttons in the windows are pressed.
>
> from Tkinter import *
> root = Tk()
>
> trees = [('The Larch!', 'light blue'),
> ('The Pine!', 'light green'),
> ('The Giant Redwood!', 'red')]
>
> def salutation(j=""):
> print j + " Something!"
>
> for (tree, color) in trees:
> win = Toplevel(root)
> win.title('Sing...')
> win.protocol('WM_DELETE_WINDOW', lambda:0)
> win.iconbitmap('py-blue-trans-out.ico')
> msg = Button(win, text='Write Something',
> command=salutation(tree))
You are calling the function here. Parenthesis after a callable like a
function means "call it *now*", so you are calling `salutation()` and bind
the *result* of that call to `command`. An idiomatic solution is to use a
``lambda`` function::
msg = Button(win,
text='Write Something',
command=lambda t=tree: salutation(t))
In Python 2.5 there's an alternative way with the `functools.partial()`
function:
from functools import partial
# ...
msg = Button(win,
text='Write Something',
command=partial(salutation, tree))
Ciao,
Marc 'BlackJack' Rintsch
More information about the Python-list
mailing list