]>
git.saurik.com Git - wxWidgets.git/blob - wxPython/demo/Menu.py
   1 #------------------------------------------------------------------- 
   4 # menus in wxPython 2.3.3 
   6 #------------------------------------------------------------------- 
   8 # o Debug message when adding a menu item (see last menu): 
  10 #   Debug: ..\..\src\msw\menuitem.cpp(370): 'GetMenuState' failed with  
  11 #   error 0x00000002 (the system cannot find the file specified.).  
  18 #------------------------------------------------------------------- 
  20 class MyFrame(wx
.Frame
): 
  22     def __init__(self
, parent
, id, log
): 
  23         wx
.Frame
.__init
__(self
, parent
, id, 'Playing with menus', size
=(400, 200)) 
  27         self
.CreateStatusBar() 
  28         self
.SetStatusText("This is the statusbar") 
  30         tc 
= wx
.TextCtrl(self
, -1, """ 
  31 A bunch of bogus menus have been created for this frame.  You 
  32 can play around with them to see how they behave and then 
  33 check the source for this sample to see how to implement them. 
  34 """, style
=wx
.TE_READONLY|wx
.TE_MULTILINE
) 
  36         # Prepare the menu bar 
  37         menuBar 
= wx
.MenuBar() 
  41         menu1
.Append(101, "&Mercury", "This the text in the Statusbar") 
  42         menu1
.Append(102, "&Venus", "") 
  43         menu1
.Append(103, "&Earth", "You may select Earth too") 
  44         menu1
.AppendSeparator() 
  45         menu1
.Append(104, "&Close", "Close this frame") 
  46         # Add menu to the menu bar 
  47         menuBar
.Append(menu1
, "&Planets") 
  51         menu2
.Append(201, "Hydrogen") 
  52         menu2
.Append(202, "Helium") 
  53         # a submenu in the 2nd menu 
  55         submenu
.Append(2031,"Lanthanium") 
  56         submenu
.Append(2032,"Cerium") 
  57         submenu
.Append(2033,"Praseodymium") 
  58         menu2
.AppendMenu(203, "Lanthanides", submenu
) 
  60         menuBar
.Append(menu2
, "&Elements") 
  64         menu3
.Append(301, "IDLE", "a Python shell using tcl/tk as GUI", wx
.ITEM_RADIO
) 
  65         menu3
.Append(302, "PyCrust", "a Python shell using wxPython as GUI", wx
.ITEM_RADIO
) 
  66         menu3
.Append(303, "psi", "a simple Python shell using wxPython as GUI", wx
.ITEM_RADIO
) 
  67         menu3
.AppendSeparator() 
  68         menu3
.Append(304, "project1", "", wx
.ITEM_NORMAL
) 
  69         menu3
.Append(305, "project2", "", wx
.ITEM_NORMAL
) 
  70         menuBar
.Append(menu3
, "&Shells") 
  74         menu4
.Append(401, "letters", "abcde...", wx
.ITEM_CHECK
) 
  75         menu4
.Append(402, "digits", "123...", wx
.ITEM_CHECK
) 
  76         menu4
.Append(403, "letters and digits", "abcd... + 123...", wx
.ITEM_CHECK
) 
  77         menuBar
.Append(menu4
, "Chec&k") 
  80         # Show how to put an icon in the menu 
  81         item 
= wx
.MenuItem(menu5
, 500, "&Smile!\tCtrl+S", "This one has an icon") 
  82         item
.SetBitmap(images
.getSmilesBitmap()) 
  83         menu5
.AppendItem(item
) 
  86         menu5
.Append(501, "Interesting thing\tCtrl+A", "Note the shortcut!") 
  87         menu5
.AppendSeparator() 
  88         menu5
.Append(502, "Hello\tShift+H") 
  89         menu5
.AppendSeparator() 
  90         menu5
.Append(503, "remove the submenu") 
  92         menu6
.Append(601, "Submenu Item") 
  93         menu5
.AppendMenu(504, "submenu", menu6
) 
  94         menu5
.Append(505, "remove this menu") 
  95         menu5
.Append(506, "this is updated") 
  96         menu5
.Append(507, "insert after this...") 
  97         menu5
.Append(508, "...and before this") 
  98         menuBar
.Append(menu5
, "&Fun") 
 100         self
.SetMenuBar(menuBar
) 
 103         self
.Bind(wx
.EVT_MENU_HIGHLIGHT_ALL
, self
.OnMenuHighlight
) 
 105         self
.Bind(wx
.EVT_MENU
, self
.Menu101
, id=101) 
 106         self
.Bind(wx
.EVT_MENU
, self
.Menu102
, id=102) 
 107         self
.Bind(wx
.EVT_MENU
, self
.Menu103
, id=103) 
 108         self
.Bind(wx
.EVT_MENU
, self
.CloseWindow
, id=104) 
 110         self
.Bind(wx
.EVT_MENU
, self
.Menu201
, id=201) 
 111         self
.Bind(wx
.EVT_MENU
, self
.Menu202
, id=202) 
 112         self
.Bind(wx
.EVT_MENU
, self
.Menu2031
, id=2031) 
 113         self
.Bind(wx
.EVT_MENU
, self
.Menu2032
, id=2032) 
 114         self
.Bind(wx
.EVT_MENU
, self
.Menu2033
, id=2033) 
 116         self
.Bind(wx
.EVT_MENU
, self
.Menu301To303
, id=301) 
 117         self
.Bind(wx
.EVT_MENU
, self
.Menu301To303
, id=302) 
 118         self
.Bind(wx
.EVT_MENU
, self
.Menu301To303
, id=303) 
 119         self
.Bind(wx
.EVT_MENU
, self
.Menu304
, id=304) 
 120         self
.Bind(wx
.EVT_MENU
, self
.Menu305
, id=305) 
 122         # Range of menu items 
 123         self
.Bind(wx
.EVT_MENU_RANGE
, self
.Menu401To403
, id=401, id2
=403) 
 125         self
.Bind(wx
.EVT_MENU
, self
.Menu500
, id=500) 
 126         self
.Bind(wx
.EVT_MENU
, self
.Menu501
, id=501) 
 127         self
.Bind(wx
.EVT_MENU
, self
.Menu502
, id=502) 
 128         self
.Bind(wx
.EVT_MENU
, self
.TestRemove
, id=503) 
 129         self
.Bind(wx
.EVT_MENU
, self
.TestRemove2
, id=505) 
 130         self
.Bind(wx
.EVT_MENU
, self
.TestInsert
, id=507) 
 131         self
.Bind(wx
.EVT_MENU
, self
.TestInsert
, id=508) 
 133         wx
.GetApp().Bind(wx
.EVT_UPDATE_UI
, self
.TestUpdateUI
, id=506) 
 137     def OnMenuHighlight(self
, event
): 
 138         # Show how to get menu item info from this event handler 
 139         id = event
.GetMenuId() 
 140         item 
= self
.GetMenuBar().FindItemById(id) 
 142             text 
= item
.GetText() 
 143             help = item
.GetHelp() 
 145         # but in this case just call Skip so the default is done 
 149     def Menu101(self
, event
): 
 150         self
.log
.write('Welcome to Mercury\n') 
 152     def Menu102(self
, event
): 
 153         self
.log
.write('Welcome to Venus\n') 
 155     def Menu103(self
, event
): 
 156         self
.log
.write('Welcome to the Earth\n') 
 158     def CloseWindow(self
, event
): 
 161     def Menu201(self
, event
): 
 162         self
.log
.write('Chemical element number 1\n') 
 164     def Menu202(self
, event
): 
 165         self
.log
.write('Chemical element number 2\n') 
 167     def Menu2031(self
, event
): 
 168         self
.log
.write('Element number 57\n') 
 170     def Menu2032(self
, event
): 
 171         self
.log
.write('Element number 58\n') 
 173     def Menu2033(self
, event
): 
 174         self
.log
.write('Element number 59\n') 
 176     def Menu301To303(self
, event
): 
 178         self
.log
.write('Event id: %d\n' % id) 
 180     def Menu304(self
, event
): 
 181         self
.log
.write('Not yet available\n') 
 183     def Menu305(self
, event
): 
 184         self
.log
.write('Still vapour\n') 
 186     def Menu401To403(self
, event
): 
 187         self
.log
.write('From a EVT_MENU_RANGE event\n') 
 189     def Menu500(self
, event
): 
 190         self
.log
.write('Have a happy day!\n') 
 192     def Menu501(self
, event
): 
 193         self
.log
.write('Look in the code how the shortcut has been realized\n') 
 195     def Menu502(self
, event
): 
 196         self
.log
.write('Hello from Jean-Michel\n') 
 199     def TestRemove(self
, evt
): 
 200         mb 
= self
.GetMenuBar() 
 201         submenuItem 
= mb
.FindItemById(601) 
 206         submenu 
= submenuItem
.GetMenu() 
 207         menu 
= submenu
.GetParent() 
 213         menu
.RemoveItem(mb
.FindItemById(504))   
 215         # This doesn't work, as expected since submenuItem is not on menu         
 216         #menu.RemoveItem(submenuItem)    
 219     def TestRemove2(self
, evt
): 
 220         mb 
= self
.GetMenuBar() 
 224     def TestUpdateUI(self
, evt
): 
 229     def TestInsert(self
, evt
): 
 232         mb 
= self
.GetMenuBar() 
 233         menuItem 
= mb
.FindItemById(theID
) 
 234         menu 
= menuItem
.GetMenu() 
 236         # figure out the position to insert at 
 239         for i 
in menu
.GetMenuItems(): 
 240             if i
.GetId() == theID
: 
 245         # now insert the new item 
 247         ##menu.Insert(pos, ID, "NewItem " + str(ID)) 
 248         item 
= wx
.MenuItem(menu
) 
 250         item
.SetText("NewItem " + str(ID
)) 
 251         menu
.InsertItem(pos
, item
) 
 254 #------------------------------------------------------------------- 
 258 def runTest(frame
, nb
, log
): 
 259     win 
= MyFrame(frame
, -1, log
) 
 264 #------------------------------------------------------------------- 
 268 A demo of using wx.MenuBar and wx.Menu in various ways. 
 270 A menu is a popup (or pull down) list of items, one of which may be selected  
 271 before the menu goes away (clicking elsewhere dismisses the menu). Menus may be  
 272 used to construct either menu bars or popup menus. 
 274 A menu item has an integer ID associated with it which can be used to identify  
 275 the selection, or to change the menu item in some way. A menu item with a special  
 276 identifier -1 is a separator item and doesn't have an associated command but just  
 277 makes a separator line appear in the menu. 
 279 Menu items may be either normal items, check items or radio items. Normal items  
 280 don't have any special properties while the check items have a boolean flag associated  
 281 to them and they show a checkmark in the menu when the flag is set. wxWindows  
 282 automatically toggles the flag value when the item is clicked and its value may  
 283 be retrieved using either IsChecked method of wx.Menu or wx.MenuBar itself or by  
 284 using wxEvent.IsChecked when you get the menu notification for the item in question. 
 286 The radio items are similar to the check items except that all the other items  
 287 in the same radio group are unchecked when a radio item is checked. The radio group  
 288 is formed by a contiguous range of radio items, i.e. it starts at the first item of  
 289 this kind and ends with the first item of a different kind (or the end of the menu).  
 290 Notice that because the radio groups are defined in terms of the item positions  
 291 inserting or removing the items in the menu containing the radio items risks to not  
 292 work correctly. Finally note that the radio items are only supported under Windows  
 298 if __name__ 
== '__main__': 
 301     run
.main(['', os
.path
.basename(sys
.argv
[0])])