/Demo/tkinter/matt/menu-all-types-of-entries.py
Python | 244 lines | 105 code | 55 blank | 84 comment | 0 complexity | 42c18962a05f41fd0b08689fcf3e7175 MD5 | raw file
- from Tkinter import *
- # some vocabulary to keep from getting confused. This terminology
- # is something I cooked up for this file, but follows the man pages
- # pretty closely
- #
- #
- #
- # This is a MENUBUTTON
- # V
- # +-------------+
- # | |
- #
- # +------------++------------++------------+
- # | || || |
- # | File || Edit || Options | <-------- the MENUBAR
- # | || || |
- # +------------++------------++------------+
- # | New... |
- # | Open... |
- # | Print |
- # | | <-------- This is a MENU. The lines of text in the menu are
- # | | MENU ENTRIES
- # | +---------------+
- # | Open Files > | file1 |
- # | | file2 |
- # | | another file | <------ this cascading part is also a MENU
- # +----------------| |
- # | |
- # | |
- # | |
- # +---------------+
- # some miscellaneous callbacks
- def new_file():
- print "opening new file"
- def open_file():
- print "opening OLD file"
- def print_something():
- print "picked a menu item"
- anchovies = 0
- def print_anchovies():
- global anchovies
- anchovies = not anchovies
- print "anchovies?", anchovies
- def makeCommandMenu():
- # make menu button
- Command_button = Menubutton(mBar, text='Simple Button Commands',
- underline=0)
- Command_button.pack(side=LEFT, padx="2m")
- # make the pulldown part of the File menu. The parameter passed is the master.
- # we attach it to the button as a python attribute called "menu" by convention.
- # hopefully this isn't too confusing...
- Command_button.menu = Menu(Command_button)
- # just to be cute, let's disable the undo option:
- Command_button.menu.add_command(label="Undo")
- # undo is the 0th entry...
- Command_button.menu.entryconfig(0, state=DISABLED)
- Command_button.menu.add_command(label='New...', underline=0,
- command=new_file)
- Command_button.menu.add_command(label='Open...', underline=0,
- command=open_file)
- Command_button.menu.add_command(label='Different Font', underline=0,
- font='-*-helvetica-*-r-*-*-*-180-*-*-*-*-*-*',
- command=print_something)
- # we can make bitmaps be menu entries too. File format is X11 bitmap.
- # if you use XV, save it under X11 bitmap format. duh-uh.,..
- Command_button.menu.add_command(
- bitmap="info")
- #bitmap='@/home/mjc4y/dilbert/project.status.is.doomed.last.panel.bm')
- # this is just a line
- Command_button.menu.add('separator')
- # change the color
- Command_button.menu.add_command(label='Quit', underline=0,
- background='red',
- activebackground='green',
- command=Command_button.quit)
- # set up a pointer from the file menubutton back to the file menu
- Command_button['menu'] = Command_button.menu
- return Command_button
- def makeCascadeMenu():
- # make menu button
- Cascade_button = Menubutton(mBar, text='Cascading Menus', underline=0)
- Cascade_button.pack(side=LEFT, padx="2m")
- # the primary pulldown
- Cascade_button.menu = Menu(Cascade_button)
- # this is the menu that cascades from the primary pulldown....
- Cascade_button.menu.choices = Menu(Cascade_button.menu)
- # ...and this is a menu that cascades from that.
- Cascade_button.menu.choices.wierdones = Menu(Cascade_button.menu.choices)
- # then you define the menus from the deepest level on up.
- Cascade_button.menu.choices.wierdones.add_command(label='avacado')
- Cascade_button.menu.choices.wierdones.add_command(label='belgian endive')
- Cascade_button.menu.choices.wierdones.add_command(label='beefaroni')
- # definition of the menu one level up...
- Cascade_button.menu.choices.add_command(label='Chocolate')
- Cascade_button.menu.choices.add_command(label='Vanilla')
- Cascade_button.menu.choices.add_command(label='TuttiFruiti')
- Cascade_button.menu.choices.add_command(label='WopBopaLoopBapABopBamBoom')
- Cascade_button.menu.choices.add_command(label='Rocky Road')
- Cascade_button.menu.choices.add_command(label='BubbleGum')
- Cascade_button.menu.choices.add_cascade(
- label='Wierd Flavors',
- menu=Cascade_button.menu.choices.wierdones)
- # and finally, the definition for the top level
- Cascade_button.menu.add_cascade(label='more choices',
- menu=Cascade_button.menu.choices)
- Cascade_button['menu'] = Cascade_button.menu
- return Cascade_button
- def makeCheckbuttonMenu():
- global fred
- # make menu button
- Checkbutton_button = Menubutton(mBar, text='Checkbutton Menus',
- underline=0)
- Checkbutton_button.pack(side=LEFT, padx='2m')
- # the primary pulldown
- Checkbutton_button.menu = Menu(Checkbutton_button)
- # and all the check buttons. Note that the "variable" "onvalue" and "offvalue" options
- # are not supported correctly at present. You have to do all your application
- # work through the calback.
- Checkbutton_button.menu.add_checkbutton(label='Pepperoni')
- Checkbutton_button.menu.add_checkbutton(label='Sausage')
- Checkbutton_button.menu.add_checkbutton(label='Extra Cheese')
- # so here's a callback
- Checkbutton_button.menu.add_checkbutton(label='Anchovy',
- command=print_anchovies)
- # and start with anchovies selected to be on. Do this by
- # calling invoke on this menu option. To refer to the "anchovy" menu
- # entry we need to know it's index. To do this, we use the index method
- # which takes arguments of several forms:
- #
- # argument what it does
- # -----------------------------------
- # a number -- this is useless.
- # "last" -- last option in the menu
- # "none" -- used with the activate command. see the man page on menus
- # "active" -- the currently active menu option. A menu option is made active
- # with the 'activate' method
- # "@number" -- where 'number' is an integer and is treated like a y coordinate in pixels
- # string pattern -- this is the option used below, and attempts to match "labels" using the
- # rules of Tcl_StringMatch
- Checkbutton_button.menu.invoke(Checkbutton_button.menu.index('Anchovy'))
- # set up a pointer from the file menubutton back to the file menu
- Checkbutton_button['menu'] = Checkbutton_button.menu
- return Checkbutton_button
- def makeRadiobuttonMenu():
- # make menu button
- Radiobutton_button = Menubutton(mBar, text='Radiobutton Menus',
- underline=0)
- Radiobutton_button.pack(side=LEFT, padx='2m')
- # the primary pulldown
- Radiobutton_button.menu = Menu(Radiobutton_button)
- # and all the Radio buttons. Note that the "variable" "onvalue" and "offvalue" options
- # are not supported correctly at present. You have to do all your application
- # work through the calback.
- Radiobutton_button.menu.add_radiobutton(label='Republican')
- Radiobutton_button.menu.add_radiobutton(label='Democrat')
- Radiobutton_button.menu.add_radiobutton(label='Libertarian')
- Radiobutton_button.menu.add_radiobutton(label='Commie')
- Radiobutton_button.menu.add_radiobutton(label='Facist')
- Radiobutton_button.menu.add_radiobutton(label='Labor Party')
- Radiobutton_button.menu.add_radiobutton(label='Torie')
- Radiobutton_button.menu.add_radiobutton(label='Independent')
- Radiobutton_button.menu.add_radiobutton(label='Anarchist')
- Radiobutton_button.menu.add_radiobutton(label='No Opinion')
- # set up a pointer from the file menubutton back to the file menu
- Radiobutton_button['menu'] = Radiobutton_button.menu
- return Radiobutton_button
- def makeDisabledMenu():
- Dummy_button = Menubutton(mBar, text='Dead Menu', underline=0)
- Dummy_button.pack(side=LEFT, padx='2m')
- # this is the standard way of turning off a whole menu
- Dummy_button["state"] = DISABLED
- return Dummy_button
- #################################################
- #### Main starts here ...
- root = Tk()
- # make a menu bar
- mBar = Frame(root, relief=RAISED, borderwidth=2)
- mBar.pack(fill=X)
- Command_button = makeCommandMenu()
- Cascade_button = makeCascadeMenu()
- Checkbutton_button = makeCheckbuttonMenu()
- Radiobutton_button = makeRadiobuttonMenu()
- NoMenu = makeDisabledMenu()
- # finally, install the buttons in the menu bar.
- # This allows for scanning from one menubutton to the next.
- mBar.tk_menuBar(Command_button, Cascade_button, Checkbutton_button, Radiobutton_button, NoMenu)
- root.title('menu demo')
- root.iconname('menu demo')
- root.mainloop()