dynoption.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. """
  2. OptionMenu widget modified to allow dynamic menu reconfiguration
  3. and setting of highlightthickness
  4. """
  5. import copy
  6. from tkinter import OptionMenu, _setit, StringVar, Button
  7. class DynOptionMenu(OptionMenu):
  8. """
  9. unlike OptionMenu, our kwargs can include highlightthickness
  10. """
  11. def __init__(self, master, variable, value, *values, **kwargs):
  12. # TODO copy value instead of whole dict
  13. kwargsCopy=copy.copy(kwargs)
  14. if 'highlightthickness' in list(kwargs.keys()):
  15. del(kwargs['highlightthickness'])
  16. OptionMenu.__init__(self, master, variable, value, *values, **kwargs)
  17. self.config(highlightthickness=kwargsCopy.get('highlightthickness'))
  18. #self.menu=self['menu']
  19. self.variable=variable
  20. self.command=kwargs.get('command')
  21. def SetMenu(self,valueList,value=None):
  22. """
  23. clear and reload the menu with a new set of options.
  24. valueList - list of new options
  25. value - initial value to set the optionmenu's menubutton to
  26. """
  27. self['menu'].delete(0,'end')
  28. for item in valueList:
  29. self['menu'].add_command(label=item,
  30. command=_setit(self.variable,item,self.command))
  31. if value:
  32. self.variable.set(value)
  33. def _dyn_option_menu(parent): # htest #
  34. from tkinter import Toplevel # + StringVar, Button
  35. top = Toplevel(parent)
  36. top.title("Tets dynamic option menu")
  37. x, y = map(int, parent.geometry().split('+')[1:])
  38. top.geometry("200x100+%d+%d" % (x + 250, y + 175))
  39. top.focus_set()
  40. var = StringVar(top)
  41. var.set("Old option set") #Set the default value
  42. dyn = DynOptionMenu(top,var, "old1","old2","old3","old4")
  43. dyn.pack()
  44. def update():
  45. dyn.SetMenu(["new1","new2","new3","new4"], value="new option set")
  46. button = Button(top, text="Change option set", command=update)
  47. button.pack()
  48. if __name__ == '__main__':
  49. from idlelib.idle_test.htest import run
  50. run(_dyn_option_menu)