diff --git a/util/popup.py b/util/popup.py new file mode 100644 index 0000000..d526440 --- /dev/null +++ b/util/popup.py @@ -0,0 +1,54 @@ +"""Pop-up menus.""" + +import logging + +try: + import Tkinter as tk +except ImportError: + # python 3 + import tkinter as tk + +import functools + +class menu(object): + def __init__(self, parent=None, leave=True): + if not parent: + self._root = tk.Tk() + self._root.withdraw() + self._menu = tk.Menu(self._root, tearoff=0) + self._menu.bind("", self._on_focus_out) + else: + self._root = parent.root() + self._root.withdraw() + self._menu = tk.Menu(self._root, tearoff=0) + self._menu.bind("", self._on_focus_out) + if leave: + self._menu.bind("", self._on_focus_out) + + def root(self): + return self._root + + def menu(self): + return self._menu + + def _on_focus_out(self, event=None): + self._root.destroy() + + def _on_click(self, callback): + self._root.destroy() + callback() + + def add_cascade(self, menuitem, submenu): + self._menu.add_cascade(label=menuitem, menu=submenu.menu()) + + def add_menuitem(self, menuitem, callback): + self._menu.add_command(label=menuitem, command=functools.partial(self._on_click, callback)) + + def show(self, event, offset_x=0, offset_y=0): + try: + self._menu.tk_popup(event['x'] + offset_x, event['y'] + offset_y) + finally: + self._menu.grab_release() + self._root.mainloop() + +# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4