1 """
2 OptionMenu widget modified to allow dynamic menu reconfiguration
3 and setting of highlightthickness
4 """
5 from tkinter import OptionMenu, _setit, StringVar, Button
6
7 class ESC[4;38;5;81mDynOptionMenu(ESC[4;38;5;149mOptionMenu):
8 """Add SetMenu and highlightthickness to OptionMenu.
9
10 Highlightthickness adds space around menu button.
11 """
12 def __init__(self, master, variable, value, *values, **kwargs):
13 highlightthickness = kwargs.pop('highlightthickness', None)
14 OptionMenu.__init__(self, master, variable, value, *values, **kwargs)
15 self['highlightthickness'] = highlightthickness
16 self.variable = variable
17 self.command = kwargs.get('command')
18
19 def SetMenu(self,valueList,value=None):
20 """
21 clear and reload the menu with a new set of options.
22 valueList - list of new options
23 value - initial value to set the optionmenu's menubutton to
24 """
25 self['menu'].delete(0,'end')
26 for item in valueList:
27 self['menu'].add_command(label=item,
28 command=_setit(self.variable,item,self.command))
29 if value:
30 self.variable.set(value)
31
32
33 def _dyn_option_menu(parent): # htest #
34 from tkinter import Toplevel # + StringVar, Button
35
36 top = Toplevel(parent)
37 top.title("Test dynamic option menu")
38 x, y = map(int, parent.geometry().split('+')[1:])
39 top.geometry("200x100+%d+%d" % (x + 250, y + 175))
40 top.focus_set()
41
42 var = StringVar(top)
43 var.set("Old option set") #Set the default value
44 dyn = DynOptionMenu(top, var, "old1","old2","old3","old4",
45 highlightthickness=5)
46 dyn.pack()
47
48 def update():
49 dyn.SetMenu(["new1","new2","new3","new4"], value="new option set")
50 button = Button(top, text="Change option set", command=update)
51 button.pack()
52
53
54 if __name__ == '__main__':
55 # Only module without unittests because of intention to replace.
56 from idlelib.idle_test.htest import run
57 run(_dyn_option_menu)