5 class OptionMenu(Pmw.MegaWidget):
7 def __init__(self, parent = None, **kw):
9 # Define the megawidget options.
12 ('command', None, None),
13 ('items', (), INITOPT),
14 ('initialitem', None, INITOPT),
15 ('labelmargin', 0, INITOPT),
16 ('labelpos', None, INITOPT),
17 ('sticky', 'ew', INITOPT),
19 self.defineoptions(kw, optiondefs)
21 # Initialise the base class (after defining the options).
22 Pmw.MegaWidget.__init__(self, parent)
24 # Create the components.
25 interior = self.interior()
27 self._menubutton = self.createcomponent('menubutton',
29 Tkinter.Menubutton, (interior,),
34 highlightthickness = 2,
38 self._menubutton.grid(column = 2, row = 2, sticky = self['sticky'])
40 self._menu = self.createcomponent('menu',
42 Tkinter.Menu, (self._menubutton,),
45 self._menubutton.configure(menu = self._menu)
47 interior.grid_columnconfigure(2, weight = 1)
48 interior.grid_rowconfigure(2, weight = 1)
51 self.createlabel(interior)
53 # Add the items specified by the initialisation option.
55 self.setitems(self['items'], self['initialitem'])
57 # Check keywords and initialise options.
58 self.initialiseoptions()
60 def setitems(self, items, index = None):
62 # Clean up old items and callback commands.
63 for oldIndex in range(len(self._itemList)):
64 tclCommandName = str(self._menu.entrycget(oldIndex, 'command'))
65 if tclCommandName != '':
66 self._menu.deletecommand(tclCommandName)
67 self._menu.delete(0, 'end')
68 self._itemList = list(items)
70 # Set the items in the menu component.
72 self._menu.add_command(label = item,
73 command = lambda self = self, item = item: self._invoke(item))
75 # Set the currently selected value.
77 var = str(self._menubutton.cget('textvariable'))
79 # None means do not change text variable.
83 elif str(self._menubutton.cget('text')) in items:
84 # Do not change selection if it is still valid
89 index = self.index(index)
90 text = self._itemList[index]
94 def getcurselection(self):
95 var = str(self._menubutton.cget('textvariable'))
97 return str(self._menubutton.cget('text'))
99 return self._menu.tk.globalgetvar(var)
102 return self.getcurselection()
104 def setvalue(self, text):
105 var = str(self._menubutton.cget('textvariable'))
107 self._menubutton.configure(text = text)
109 self._menu.tk.globalsetvar(var, text)
111 def index(self, index):
112 listLength = len(self._itemList)
113 if type(index) == types.IntType:
114 if index < listLength:
117 raise ValueError, 'index "%s" is out of range' % index
118 elif index is Pmw.END:
120 return listLength - 1
122 raise ValueError, 'OptionMenu has no items'
124 if index is Pmw.SELECT:
126 index = self.getcurselection()
128 raise ValueError, 'OptionMenu has no items'
129 if index in self._itemList:
130 return self._itemList.index(index)
132 'bad index "%s": must be a ' \
133 'name, a number, Pmw.END or Pmw.SELECT' % (index,)
135 def invoke(self, index = Pmw.SELECT):
136 index = self.index(index)
137 text = self._itemList[index]
139 return self._invoke(text)
141 def _invoke(self, text):
144 command = self['command']
145 if callable(command):