]>
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 imfo from this event handler 
 139         id = event
.GetMenuId() 
 140         item 
= self
.GetMenuBar().FindItemById(id) 
 141         text 
= item
.GetText() 
 142         help = item
.GetHelp() 
 144         # but in this case just call Skip so the default is done 
 148     def Menu101(self
, event
): 
 149         self
.log
.write('Welcome to Mercury\n') 
 151     def Menu102(self
, event
): 
 152         self
.log
.write('Welcome to Venus\n') 
 154     def Menu103(self
, event
): 
 155         self
.log
.write('Welcome to the Earth\n') 
 157     def CloseWindow(self
, event
): 
 160     def Menu201(self
, event
): 
 161         self
.log
.write('Chemical element number 1\n') 
 163     def Menu202(self
, event
): 
 164         self
.log
.write('Chemical element number 2\n') 
 166     def Menu2031(self
, event
): 
 167         self
.log
.write('Element number 57\n') 
 169     def Menu2032(self
, event
): 
 170         self
.log
.write('Element number 58\n') 
 172     def Menu2033(self
, event
): 
 173         self
.log
.write('Element number 59\n') 
 175     def Menu301To303(self
, event
): 
 177         self
.log
.write('Event id: %d\n' % id) 
 179     def Menu304(self
, event
): 
 180         self
.log
.write('Not yet available\n') 
 182     def Menu305(self
, event
): 
 183         self
.log
.write('Still vapour\n') 
 185     def Menu401To403(self
, event
): 
 186         self
.log
.write('From a EVT_MENU_RANGE event\n') 
 188     def Menu500(self
, event
): 
 189         self
.log
.write('Have a happy day!\n') 
 191     def Menu501(self
, event
): 
 192         self
.log
.write('Look in the code how the shortcut has been realized\n') 
 194     def Menu502(self
, event
): 
 195         self
.log
.write('Hello from Jean-Michel\n') 
 198     def TestRemove(self
, evt
): 
 199         mb 
= self
.GetMenuBar() 
 200         submenuItem 
= mb
.FindItemById(601) 
 205         submenu 
= submenuItem
.GetMenu() 
 206         menu 
= submenu
.GetParent() 
 212         menu
.RemoveItem(mb
.FindItemById(504))   
 214         # This doesn't work, as expected since submenuItem is not on menu         
 215         #menu.RemoveItem(submenuItem)    
 218     def TestRemove2(self
, evt
): 
 219         mb 
= self
.GetMenuBar() 
 223     def TestUpdateUI(self
, evt
): 
 228     def TestInsert(self
, evt
): 
 231         mb 
= self
.GetMenuBar() 
 232         menuItem 
= mb
.FindItemById(theID
) 
 233         menu 
= menuItem
.GetMenu() 
 235         # figure out the position to insert at 
 238         for i 
in menu
.GetMenuItems(): 
 239             if i
.GetId() == theID
: 
 244         # now insert the new item 
 246         ##menu.Insert(pos, ID, "NewItem " + str(ID)) 
 247         item 
= wx
.MenuItem(menu
) 
 249         item
.SetText("NewItem " + str(ID
)) 
 250         menu
.InsertItem(pos
, item
) 
 253 #------------------------------------------------------------------- 
 257 def runTest(frame
, nb
, log
): 
 258     win 
= MyFrame(frame
, -1, log
) 
 263 #------------------------------------------------------------------- 
 267 A demo of using wx.MenuBar and wx.Menu in various ways. 
 269 A menu is a popup (or pull down) list of items, one of which may be selected  
 270 before the menu goes away (clicking elsewhere dismisses the menu). Menus may be  
 271 used to construct either menu bars or popup menus. 
 273 A menu item has an integer ID associated with it which can be used to identify  
 274 the selection, or to change the menu item in some way. A menu item with a special  
 275 identifier -1 is a separator item and doesn't have an associated command but just  
 276 makes a separator line appear in the menu. 
 278 Menu items may be either normal items, check items or radio items. Normal items  
 279 don't have any special properties while the check items have a boolean flag associated  
 280 to them and they show a checkmark in the menu when the flag is set. wxWindows  
 281 automatically toggles the flag value when the item is clicked and its value may  
 282 be retrieved using either IsChecked method of wx.Menu or wx.MenuBar itself or by  
 283 using wxEvent.IsChecked when you get the menu notification for the item in question. 
 285 The radio items are similar to the check items except that all the other items  
 286 in the same radio group are unchecked when a radio item is checked. The radio group  
 287 is formed by a contiguous range of radio items, i.e. it starts at the first item of  
 288 this kind and ends with the first item of a different kind (or the end of the menu).  
 289 Notice that because the radio groups are defined in terms of the item positions  
 290 inserting or removing the items in the menu containing the radio items risks to not  
 291 work correctly. Finally note that the radio items are only supported under Windows  
 297 if __name__ 
== '__main__': 
 300     run
.main(['', os
.path
.basename(sys
.argv
[0])])