PageRenderTime 606ms CodeModel.GetById 272ms app.highlight 101ms RepoModel.GetById 150ms app.codeStats 0ms

/Demo/tkinter/matt/menu-all-types-of-entries.py

http://unladen-swallow.googlecode.com/
Python | 244 lines | 105 code | 55 blank | 84 comment | 1 complexity | 13f7f7893953389ec8ba5c1d4f50715a MD5 | raw file
  1from Tkinter import *
  2
  3# some vocabulary to keep from getting confused. This terminology
  4# is something I cooked up for this file, but follows the man pages
  5# pretty closely
  6#
  7#
  8#
  9#       This is a MENUBUTTON
 10#       V
 11# +-------------+
 12# |             |
 13#
 14# +------------++------------++------------+
 15# |            ||            ||            |
 16# |  File      ||  Edit      || Options    |   <-------- the MENUBAR
 17# |            ||            ||            |
 18# +------------++------------++------------+
 19# | New...         |
 20# | Open...        |
 21# | Print          |
 22# |                |  <-------- This is a MENU. The lines of text in the menu are
 23# |                |                            MENU ENTRIES
 24# |                +---------------+
 25# | Open Files >   | file1         |
 26# |                | file2         |
 27# |                | another file  | <------ this cascading part is also a MENU
 28# +----------------|               |
 29#                  |               |
 30#                  |               |
 31#                  |               |
 32#                  +---------------+
 33
 34
 35
 36# some miscellaneous callbacks
 37def new_file():
 38    print "opening new file"
 39
 40def open_file():
 41    print "opening OLD file"
 42
 43def print_something():
 44    print "picked a menu item"
 45
 46
 47
 48anchovies = 0
 49
 50def print_anchovies():
 51    global anchovies
 52    anchovies = not anchovies
 53    print "anchovies?", anchovies
 54
 55def makeCommandMenu():
 56    # make menu button
 57    Command_button = Menubutton(mBar, text='Simple Button Commands',
 58                                underline=0)
 59    Command_button.pack(side=LEFT, padx="2m")
 60
 61    # make the pulldown part of the File menu. The parameter passed is the master.
 62    # we attach it to the button as a python attribute called "menu" by convention.
 63    # hopefully this isn't too confusing...
 64    Command_button.menu = Menu(Command_button)
 65
 66    # just to be cute, let's disable the undo option:
 67    Command_button.menu.add_command(label="Undo")
 68    # undo is the 0th entry...
 69    Command_button.menu.entryconfig(0, state=DISABLED)
 70
 71    Command_button.menu.add_command(label='New...', underline=0,
 72                                    command=new_file)
 73    Command_button.menu.add_command(label='Open...', underline=0,
 74                                    command=open_file)
 75    Command_button.menu.add_command(label='Different Font', underline=0,
 76                                    font='-*-helvetica-*-r-*-*-*-180-*-*-*-*-*-*',
 77                                    command=print_something)
 78
 79    # we can make bitmaps be menu entries too. File format is X11 bitmap.
 80    # if you use XV, save it under X11 bitmap format. duh-uh.,..
 81    Command_button.menu.add_command(
 82        bitmap="info")
 83        #bitmap='@/home/mjc4y/dilbert/project.status.is.doomed.last.panel.bm')
 84
 85    # this is just a line
 86    Command_button.menu.add('separator')
 87
 88    # change the color
 89    Command_button.menu.add_command(label='Quit', underline=0,
 90                                    background='red',
 91                                    activebackground='green',
 92                                    command=Command_button.quit)
 93
 94    # set up a pointer from the file menubutton back to the file menu
 95    Command_button['menu'] = Command_button.menu
 96
 97    return Command_button
 98
 99
100
101def makeCascadeMenu():
102    # make menu button
103    Cascade_button = Menubutton(mBar, text='Cascading Menus', underline=0)
104    Cascade_button.pack(side=LEFT, padx="2m")
105
106    # the primary pulldown
107    Cascade_button.menu = Menu(Cascade_button)
108
109    # this is the menu that cascades from the primary pulldown....
110    Cascade_button.menu.choices = Menu(Cascade_button.menu)
111
112    # ...and this is a menu that cascades from that.
113    Cascade_button.menu.choices.weirdones = Menu(Cascade_button.menu.choices)
114
115    # then you define the menus from the deepest level on up.
116    Cascade_button.menu.choices.weirdones.add_command(label='avacado')
117    Cascade_button.menu.choices.weirdones.add_command(label='belgian endive')
118    Cascade_button.menu.choices.weirdones.add_command(label='beefaroni')
119
120    # definition of the menu one level up...
121    Cascade_button.menu.choices.add_command(label='Chocolate')
122    Cascade_button.menu.choices.add_command(label='Vanilla')
123    Cascade_button.menu.choices.add_command(label='TuttiFruiti')
124    Cascade_button.menu.choices.add_command(label='WopBopaLoopBapABopBamBoom')
125    Cascade_button.menu.choices.add_command(label='Rocky Road')
126    Cascade_button.menu.choices.add_command(label='BubbleGum')
127    Cascade_button.menu.choices.add_cascade(
128        label='Weird Flavors',
129        menu=Cascade_button.menu.choices.weirdones)
130
131    # and finally, the definition for the top level
132    Cascade_button.menu.add_cascade(label='more choices',
133                                    menu=Cascade_button.menu.choices)
134
135    Cascade_button['menu'] = Cascade_button.menu
136
137    return Cascade_button
138
139def makeCheckbuttonMenu():
140    global fred
141    # make menu button
142    Checkbutton_button = Menubutton(mBar, text='Checkbutton Menus',
143                                    underline=0)
144    Checkbutton_button.pack(side=LEFT, padx='2m')
145
146    # the primary pulldown
147    Checkbutton_button.menu = Menu(Checkbutton_button)
148
149    # and all the check buttons. Note that the "variable" "onvalue" and "offvalue" options
150    # are not supported correctly at present. You have to do all your application
151    # work through the calback.
152    Checkbutton_button.menu.add_checkbutton(label='Pepperoni')
153    Checkbutton_button.menu.add_checkbutton(label='Sausage')
154    Checkbutton_button.menu.add_checkbutton(label='Extra Cheese')
155
156    # so here's a callback
157    Checkbutton_button.menu.add_checkbutton(label='Anchovy',
158                                            command=print_anchovies)
159
160    # and start with anchovies selected to be on. Do this by
161    # calling invoke on this menu option. To refer to the "anchovy" menu
162    # entry we need to know it's index. To do this, we use the index method
163    # which takes arguments of several forms:
164    #
165    # argument        what it does
166    # -----------------------------------
167    # a number        -- this is useless.
168    # "last"          -- last option in the menu
169    # "none"          -- used with the activate command. see the man page on menus
170    # "active"        -- the currently active menu option. A menu option is made active
171    #                         with the 'activate' method
172    # "@number"       -- where 'number' is an integer and is treated like a y coordinate in pixels
173    # string pattern  -- this is the option used below, and attempts to match "labels" using the
174    #                    rules of Tcl_StringMatch
175    Checkbutton_button.menu.invoke(Checkbutton_button.menu.index('Anchovy'))
176
177    # set up a pointer from the file menubutton back to the file menu
178    Checkbutton_button['menu'] = Checkbutton_button.menu
179
180    return Checkbutton_button
181
182
183def makeRadiobuttonMenu():
184    # make menu button
185    Radiobutton_button = Menubutton(mBar, text='Radiobutton Menus',
186                                    underline=0)
187    Radiobutton_button.pack(side=LEFT, padx='2m')
188
189    # the primary pulldown
190    Radiobutton_button.menu = Menu(Radiobutton_button)
191
192    # and all the Radio buttons. Note that the "variable" "onvalue" and "offvalue" options
193    # are not supported correctly at present. You have to do all your application
194    # work through the calback.
195    Radiobutton_button.menu.add_radiobutton(label='Republican')
196    Radiobutton_button.menu.add_radiobutton(label='Democrat')
197    Radiobutton_button.menu.add_radiobutton(label='Libertarian')
198    Radiobutton_button.menu.add_radiobutton(label='Commie')
199    Radiobutton_button.menu.add_radiobutton(label='Facist')
200    Radiobutton_button.menu.add_radiobutton(label='Labor Party')
201    Radiobutton_button.menu.add_radiobutton(label='Torie')
202    Radiobutton_button.menu.add_radiobutton(label='Independent')
203    Radiobutton_button.menu.add_radiobutton(label='Anarchist')
204    Radiobutton_button.menu.add_radiobutton(label='No Opinion')
205
206    # set up a pointer from the file menubutton back to the file menu
207    Radiobutton_button['menu'] = Radiobutton_button.menu
208
209    return Radiobutton_button
210
211
212def makeDisabledMenu():
213    Dummy_button = Menubutton(mBar, text='Dead Menu', underline=0)
214    Dummy_button.pack(side=LEFT, padx='2m')
215
216    # this is the standard way of turning off a whole menu
217    Dummy_button["state"] = DISABLED
218    return Dummy_button
219
220
221#################################################
222#### Main starts here ...
223root = Tk()
224
225
226# make a menu bar
227mBar = Frame(root, relief=RAISED, borderwidth=2)
228mBar.pack(fill=X)
229
230Command_button     = makeCommandMenu()
231Cascade_button     = makeCascadeMenu()
232Checkbutton_button = makeCheckbuttonMenu()
233Radiobutton_button = makeRadiobuttonMenu()
234NoMenu             = makeDisabledMenu()
235
236# finally, install the buttons in the menu bar.
237# This allows for scanning from one menubutton to the next.
238mBar.tk_menuBar(Command_button, Cascade_button, Checkbutton_button, Radiobutton_button, NoMenu)
239
240
241root.title('menu demo')
242root.iconname('menu demo')
243
244root.mainloop()