Tkinter入门
前页 | Chapter 32. The Menu Widget | 后页

# Patterns

Toplevel menus are displayed just under the title bar of the root or any other toplevel windows (or on Macintosh, along the upper edge of the screen). To create a toplevel menu, create a new Menu instance, and use `add` methods to add commands and other menu entries to it.

Example 32-1. Creating a toplevel menu

    # menu-example-2.py

    from Tkinter import *

    root = Tk()

    def hello():
        print "hello!"

    # create a toplevel menu
    menubar = Menu(root)
    menubar.add_command(label="Hello!", command=hello)
    menubar.add_command(label="Quit!", command=root.quit)

    # display the menu
    root.config(menu=menubar)

    mainloop()

Pulldown menus (and other submenus) are created in a similar fashion. The main difference is that they are attached to a parent menu (using `add_cascade)`, instead of a toplevel window.

Example 32-2. Creating toplevel and pulldown menus

    # menu-example-3.py

    from Tkinter import *

    root = Tk()

    def hello():
        print "hello!"

    menubar = Menu(root)

    # create a pulldown menu, and add it to the menu bar
    filemenu = Menu(menubar, tearoff=0)
    filemenu.add_command(label="Open", command=hello)
    filemenu.add_command(label="Save", command=hello)
    filemenu.add_separator()
    filemenu.add_command(label="Exit", command=root.quit)
    menubar.add_cascade(label="File", menu=filemenu)

    # create more pulldown menus
    editmenu = Menu(menubar, tearoff=0)
    editmenu.add_command(label="Cut", command=hello)
    editmenu.add_command(label="Copy", command=hello)
    editmenu.add_command(label="Paste", command=hello)
    menubar.add_cascade(label="Edit", menu=editmenu)

    helpmenu = Menu(menubar, tearoff=0)
    helpmenu.add_command(label="About", command=hello)
    menubar.add_cascade(label="Help", menu=helpmenu)

    # display the menu
    root.config(menu=menubar)

    mainloop()

Finally, a popup menu is created in the same way, but is explicitly displayed, using the `post` method:

Example 32-3. Creating and displaying a popup menu

    # menu-example-4.py

    from Tkinter import *

    root = Tk()

    def hello():
        print "hello!"

    # create a popup menu
    menu = Menu(root, tearoff=0)
    menu.add_command(label="Undo", command=hello)
    menu.add_command(label="Redo", command=hello)

    # create a canvas
    frame = Frame(root, width=512, height=512)
    frame.pack()

    def popup(event):
        menu.post(event.x_root, event.y_root)

    # attach popup to canvas
    frame.bind("<Button-3>", popup)

    mainloop()

You can use the `postcommand` callback to update (or even create) the menu everytime it is displayed.

Example 32-4. Updating a menu on the fly

    # menu-example-5.py

    from Tkinter import *

    counter = 0

    def update():
        global counter
        counter = counter + 1
        menu.entryconfig(0, label=str(counter))

    root = Tk()

    menubar = Menu(root)

    menu = Menu(menubar, tearoff=0, postcommand=update)
    menu.add_command(label=str(counter))
    menu.add_command(label="Exit", command=root.quit)

    menubar.add_cascade(label="Test", menu=menu)

    root.config(menu=menubar)

    mainloop()

前页 | Home | 后页
The Menu Widget | Up | Methods