Steven M. Gava | f126bcb | 2001-10-26 06:49:14 +0000 | [diff] [blame] | 1 | """ |
| 2 | OptionMenu widget modified to allow dynamic menu reconfiguration |
Steven M. Gava | c034b47 | 2001-11-03 14:55:47 +0000 | [diff] [blame] | 3 | and setting of highlightthickness |
Steven M. Gava | f126bcb | 2001-10-26 06:49:14 +0000 | [diff] [blame] | 4 | """ |
Steven M. Gava | c034b47 | 2001-11-03 14:55:47 +0000 | [diff] [blame] | 5 | import copy |
Terry Jan Reedy | cf83476 | 2014-10-17 01:31:29 -0400 | [diff] [blame^] | 6 | from Tkinter import OptionMenu, _setit, StringVar, Button |
Steven M. Gava | f126bcb | 2001-10-26 06:49:14 +0000 | [diff] [blame] | 7 | |
| 8 | class DynOptionMenu(OptionMenu): |
| 9 | """ |
Steven M. Gava | c034b47 | 2001-11-03 14:55:47 +0000 | [diff] [blame] | 10 | unlike OptionMenu, our kwargs can include highlightthickness |
Steven M. Gava | f126bcb | 2001-10-26 06:49:14 +0000 | [diff] [blame] | 11 | """ |
| 12 | def __init__(self, master, variable, value, *values, **kwargs): |
Terry Jan Reedy | cf83476 | 2014-10-17 01:31:29 -0400 | [diff] [blame^] | 13 | # TODO copy value instead of whole dict |
Steven M. Gava | c034b47 | 2001-11-03 14:55:47 +0000 | [diff] [blame] | 14 | kwargsCopy=copy.copy(kwargs) |
| 15 | if 'highlightthickness' in kwargs.keys(): |
| 16 | del(kwargs['highlightthickness']) |
Steven M. Gava | f126bcb | 2001-10-26 06:49:14 +0000 | [diff] [blame] | 17 | OptionMenu.__init__(self, master, variable, value, *values, **kwargs) |
Steven M. Gava | c034b47 | 2001-11-03 14:55:47 +0000 | [diff] [blame] | 18 | self.config(highlightthickness=kwargsCopy.get('highlightthickness')) |
Steven M. Gava | f126bcb | 2001-10-26 06:49:14 +0000 | [diff] [blame] | 19 | #self.menu=self['menu'] |
| 20 | self.variable=variable |
| 21 | self.command=kwargs.get('command') |
Kurt B. Kaiser | 6655e4b | 2002-12-31 16:03:23 +0000 | [diff] [blame] | 22 | |
Steven M. Gava | 41a8532 | 2001-10-29 08:05:34 +0000 | [diff] [blame] | 23 | def SetMenu(self,valueList,value=None): |
Steven M. Gava | f126bcb | 2001-10-26 06:49:14 +0000 | [diff] [blame] | 24 | """ |
| 25 | clear and reload the menu with a new set of options. |
| 26 | valueList - list of new options |
Kurt B. Kaiser | 6655e4b | 2002-12-31 16:03:23 +0000 | [diff] [blame] | 27 | value - initial value to set the optionmenu's menubutton to |
Steven M. Gava | f126bcb | 2001-10-26 06:49:14 +0000 | [diff] [blame] | 28 | """ |
| 29 | self['menu'].delete(0,'end') |
| 30 | for item in valueList: |
| 31 | self['menu'].add_command(label=item, |
| 32 | command=_setit(self.variable,item,self.command)) |
Steven M. Gava | 41a8532 | 2001-10-29 08:05:34 +0000 | [diff] [blame] | 33 | if value: |
| 34 | self.variable.set(value) |
Terry Jan Reedy | 62012fc | 2014-05-24 18:48:03 -0400 | [diff] [blame] | 35 | |
Terry Jan Reedy | cf83476 | 2014-10-17 01:31:29 -0400 | [diff] [blame^] | 36 | def _dyn_option_menu(parent): # htest # |
| 37 | from Tkinter import Toplevel |
| 38 | |
| 39 | top = Toplevel() |
| 40 | top.title("Tets dynamic option menu") |
| 41 | top.geometry("200x100+%d+%d" % (parent.winfo_rootx() + 200, |
| 42 | parent.winfo_rooty() + 150)) |
| 43 | top.focus_set() |
| 44 | |
| 45 | var = StringVar(top) |
Terry Jan Reedy | 62012fc | 2014-05-24 18:48:03 -0400 | [diff] [blame] | 46 | var.set("Old option set") #Set the default value |
Terry Jan Reedy | cf83476 | 2014-10-17 01:31:29 -0400 | [diff] [blame^] | 47 | dyn = DynOptionMenu(top,var, "old1","old2","old3","old4") |
Terry Jan Reedy | 62012fc | 2014-05-24 18:48:03 -0400 | [diff] [blame] | 48 | dyn.pack() |
| 49 | |
| 50 | def update(): |
Terry Jan Reedy | cf83476 | 2014-10-17 01:31:29 -0400 | [diff] [blame^] | 51 | dyn.SetMenu(["new1","new2","new3","new4"], value="new option set") |
| 52 | button = Button(top, text="Change option set", command=update) |
Terry Jan Reedy | 62012fc | 2014-05-24 18:48:03 -0400 | [diff] [blame] | 53 | button.pack() |
Terry Jan Reedy | 62012fc | 2014-05-24 18:48:03 -0400 | [diff] [blame] | 54 | |
| 55 | if __name__ == '__main__': |
| 56 | from idlelib.idle_test.htest import run |
| 57 | run(_dyn_option_menu) |