Consider this code:
b = Button(admin, text="as", command=button('hey'))
It does exactly the same as this:
result = button('hey') b = button(admin, text="as", command=result)
Likewise, if you create a binding like this:
… it’s the same as this:
result = some_function() listbox.bind("<<ListboxSelect>>", result)
command option takes a reference to a function, which is a fancy way of saying you need to pass it the name of the function. To pass a reference you must use the name only, without using parenthesis or arguments. For example:
b = Button(... command = button)
If you want to pass a parameter such as “hey” you must use a little extra code:
- You can create an intermediate function that can be called without your argument and which then calls your
- You can use
lambdato create what is referred to as an anonymous function. In every way it’s a function except it doesn’t have a name. When you call the
lambdacommand it returns a reference to the created function, which means it can be used for the value of the
commandoption to the button.
- You can use functools.partial
lambda is the simplest since it doesn’t require any additional imports like
functools.partial does, though some people think that
functools.partial is easier to understand.
To create a lambda function that calls your
button function with an argument you would do something like this:
You end up with a function that is functionally equivalent to:
def some_name(): return button('hey')
As I said earlier,
lambda returns a reference to this nameless function. Since a reference is what the
command option expects you can use
lambda directly in the creation of the button:
b = Button(... command = lambda: button('hey'))
There’s a question on this site that has a lot of interesting comments about lambda, in general. See the question Why Python lambdas are useful?. That same discussion has an answer that shows how to use lambdas in a loop when you need to pass in a variable to the callback.
Finally, see the zone.effbot.org article titled Tkinter Callbacks for a nice tutorial. The coverage of
lambda is pretty lean, but the information there might still be useful.