Tkinter menu question--how to pass arguments

kyosohma at gmail.com kyosohma at gmail.com
Fri Mar 30 22:23:20 CEST 2007


On Mar 30, 2:32 pm, Kevin Walzer <k... at codebykevin.com> wrote:
> I'm having difficulty structuring a Tkinter menu entry. Here is the
> command in question:
>
> self.finkmenu.add_command(label='Update List of Packages',
> command=self.authorizeCommand(self.scanPackages))
>
> When I start my program, it crashes because it's trying to run the
> command self.authorizeCommand. The reason I'm structuring it in this
> fashion is that this command takes another command as an argument--in
> this case, self.ScanPackages.
>
> The basic structure of the program is that the self.authorizeCommand
> function pops up a dialog box for a password; it then feeds the password
> to the function that it takes as an argument, i.e. self.scanPackages.
>
> I tried setting up the menu entry without the additional parameter, i.e.
> command=self.authorizeCommand, but then when I try to run the command
> from the menu, it complains there are not enough arguments.
> Unsurprising, since self.authorizeCommand takes another function name as
> an argument.
>
> How can I structure the menu item to reflect the correct number of
> arguments without it trying to execute the command?
>
> --
> Kevin Walzer
> Code by Kevinhttp://www.codebykevin.com

There are various ways to accomplish this. The 2 most popular that I
am aware of are using a helper function or lambda.

using a lambda:

command=(lambda:self.authorizeCommand(self.scanPackages))


using a handler (i.e. indirection layer):

def func():
   self.authorizeCommand(self.scanPackages)

self.finkmenu.add_command(label='Update List of
Packages',command=func)


Both of these are talked about in detail in "Programming Python 3rd
Ed" by Lutz. I found that helpful for me. Of course, I decided to stop
using Tkinter and switched to wxPython. Hope this gets you going
though.

Mike




More information about the Python-list mailing list