Tkinter: passing parameters to menu commands

Kent Johnson kent3737 at yahoo.com
Fri Jan 7 15:50:03 EST 2005


Philippe C. Martin wrote:
> I have many menu items and would like them all to call the same method
> -However, I need the method called to react differently depending on the
> menu item selected. Since the menu command functions do not seem to
> receive any type of event style object, is there some type of Tkinter
> call that would let my method know the menu id selected ?

Much as it seems to be out of favor, IMO this is a place where a lambda expression is very handy. 
You can make a callback for each menu item that binds an extra parameter to the handler:

# Based on an example by Fredrik Lundh
from Tkinter import *

def callback(code):
     print "called the callback with code", code

root = Tk()

# create a menu
menu = Menu(root)
root.config(menu=menu)

filemenu = Menu(menu)
menu.add_cascade(label="File", menu=filemenu)
filemenu.add_command(label="New", command=lambda: callback('New'))
filemenu.add_command(label="Open...", command=lambda: callback('Open'))
filemenu.add_separator()
filemenu.add_command(label="Exit", command=lambda: callback('Exit'))

mainloop()

Of course you could do this with named forwarding functions if you prefer.

Kent



More information about the Python-list mailing list