1title = 'Pmw.MenuBar demonstration' 2 3# Import Pmw from this directory tree. 4import sys 5sys.path[:0] = ['../../..'] 6 7import tkinter 8import Pmw 9 10class Demo: 11 def __init__(self, parent): 12 # Create the Balloon. 13 self.balloon = Pmw.Balloon(parent) 14 15 # Create and pack the MenuBar. 16 menuBar = Pmw.MenuBar(parent, 17 hull_relief = 'raised', 18 hull_borderwidth = 1, 19 balloon = self.balloon) 20 menuBar.pack(fill = 'x') 21 self.menuBar = menuBar 22 23 # Add some buttons to the MenuBar. 24 menuBar.addmenu('File', 'Close this window or exit') 25 menuBar.addmenuitem('File', 'command', 'Close this window', 26 command = PrintOne('Action: close'), 27 label = 'Close') 28 menuBar.addmenuitem('File', 'separator') 29 menuBar.addmenuitem('File', 'command', 'Exit the application', 30 command = PrintOne('Action: exit'), 31 label = 'Exit') 32 33 menuBar.addmenu('Edit', 'Cut, copy or paste') 34 menuBar.addmenuitem('Edit', 'command', 'Delete the current selection', 35 command = PrintOne('Action: delete'), 36 label = 'Delete') 37 38 menuBar.addmenu('Options', 'Set user preferences') 39 menuBar.addmenuitem('Options', 'command', 'Set general preferences', 40 command = PrintOne('Action: general options'), 41 label = 'General...') 42 43 # Create a checkbutton menu item. 44 self.toggleVar = tkinter.IntVar() 45 # Initialise the checkbutton to 1: 46 self.toggleVar.set(1) 47 menuBar.addmenuitem('Options', 'checkbutton', 'Toggle me on/off', 48 label = 'Toggle', 49 command = self._toggleMe, 50 variable = self.toggleVar) 51 self._toggleMe() 52 53 menuBar.addcascademenu('Options', 'Size', 54 'Set some other preferences', traverseSpec = 'z', tearoff = 1) 55 for size in ('tiny', 'small', 'average', 'big', 'huge'): 56 menuBar.addmenuitem('Size', 'command', 'Set size to ' + size, 57 command = PrintOne('Action: size ' + size), 58 label = size) 59 60 menuBar.addmenu('Help', 'User manuals', side = 'right') 61 menuBar.addmenuitem('Help', 'command', 'About this application', 62 command = PrintOne('Action: about'), 63 label = 'About...') 64 65 # Create and pack the main part of the window. 66 self.mainPart = tkinter.Label(parent, 67 text = 'This is the\nmain part of\nthe window', 68 background = 'black', 69 foreground = 'white', 70 padx = 30, 71 pady = 30) 72 self.mainPart.pack(fill = 'both', expand = 1) 73 74 # Create and pack the MessageBar. 75 self.messageBar = Pmw.MessageBar(parent, 76 entry_width = 40, 77 entry_relief='groove', 78 labelpos = 'w', 79 label_text = 'Status:') 80 self.messageBar.pack(fill = 'x', padx = 10, pady = 10) 81 self.messageBar.message('state', 'OK') 82 83 buttonBox = Pmw.ButtonBox(parent) 84 buttonBox.pack(fill = 'x') 85 buttonBox.add('Disable\nall', command = menuBar.disableall) 86 buttonBox.add('Enable\nall', command = menuBar.enableall) 87 buttonBox.add('Create\nmenu', command = self.add) 88 buttonBox.add('Delete\nmenu', command = self.delete) 89 buttonBox.add('Create\nitem', command = self.additem) 90 buttonBox.add('Delete\nitem', command = self.deleteitem) 91 92 # Configure the balloon to displays its status messages in the 93 # message bar. 94 self.balloon.configure(statuscommand = self.messageBar.helpmessage) 95 96 self.testMenuList = [] 97 98 def _toggleMe(self): 99 print(('Toggle value:', self.toggleVar.get())) 100 101 def add(self): 102 if len(self.testMenuList) == 0: 103 num = 0 104 else: 105 num = self.testMenuList[-1] 106 num = num + 1 107 name = 'Menu%d' % num 108 self.testMenuList.append(num) 109 110 self.menuBar.addmenu(name, 'This is ' + name) 111 112 def delete(self): 113 if len(self.testMenuList) == 0: 114 self.menuBar.bell() 115 else: 116 num = self.testMenuList[0] 117 name = 'Menu%d' % num 118 del self.testMenuList[0] 119 self.menuBar.deletemenu(name) 120 121 def additem(self): 122 if len(self.testMenuList) == 0: 123 self.menuBar.bell() 124 else: 125 num = self.testMenuList[-1] 126 menuName = 'Menu%d' % num 127 menu = self.menuBar.component(menuName + '-menu') 128 if menu.index('end') is None: 129 label = 'item X' 130 else: 131 label = menu.entrycget('end', 'label') + 'X' 132 self.menuBar.addmenuitem(menuName, 'command', 'Help for ' + label, 133 command = PrintOne('Action: ' + menuName + ': ' + label), 134 label = label) 135 136 def deleteitem(self): 137 if len(self.testMenuList) == 0: 138 self.menuBar.bell() 139 else: 140 num = self.testMenuList[-1] 141 menuName = 'Menu%d' % num 142 menu = self.menuBar.component(menuName + '-menu') 143 if menu.index('end') is None: 144 self.menuBar.bell() 145 else: 146 self.menuBar.deletemenuitems(menuName, 0) 147 148class PrintOne: 149 def __init__(self, text): 150 self.text = text 151 152 def __call__(self): 153 print((self.text)) 154 155###################################################################### 156 157# Create demo in root window for testing. 158if __name__ == '__main__': 159 root = tkinter.Tk() 160 Pmw.initialise(root) 161 root.title(title) 162 163 exitButton = tkinter.Button(root, text = 'Exit', command = root.destroy) 164 exitButton.pack(side = 'bottom') 165 widget = Demo(root) 166 root.mainloop() 167