import os, sys import Tkinter, Pmw balloons_on = 'balloon' # alternates are status, both balloons_off = 'none' _dialogs=[] balloon=None # Manage just one balloon flag for all dialogs def balloon_state(): "Return the state of the global balloon setting." if _balloon_var.get(): return balloons_on else: return balloons_off def toggle_balloon_state (): "Set the balloon help flag." balloon.configure(state=balloon_state()) # One common root for all dialogs _root = None def root (): "Return the root" global _root, _balloon_var, balloon if _root is None: _root = Pmw.initialise() _root.withdraw() balloon = Pmw.Balloon(_root) _balloon_var = Tkinter.IntVar(_root) iebf = 1 _balloon_var.set(iebf) if iebf: balloon.configure(state=balloons_on) else: balloon.configure(state=balloons_off) _root.balloon = balloon return _root def root_exists(): "Does the root window exist yet?" return _root is not None def set_root (root): "Set the root externally." global _root if root_exists(): raise RuntimeError, 'set_root called illegally.' _root = root class MyDialog: # should inherit, had some trouble packing though -- pfd def __init__ (self, **kw): self.am_root = not root_exists() kw['parent'] = root() if not kw.has_key('command'): kw['command'] = self.execute self.dialog = Pmw.Dialog(**kw) self.title = self.dialog.title self.interior = self.dialog.interior self.geometry = self.dialog.geometry self.component = self.dialog.component self.config = self.dialog.config self.option_add = self.dialog.option_add self.balloon=balloon self.transient= self.dialog.transient self.withdraw = self.dialog.withdraw self.deiconify = self.dialog.deiconify self.activate = self.dialog.activate self.deactivate = self.dialog.deactivate _dialogs.append(self) def position_popup (self, popup, transient=1): "Position a dialog over this one." if transient: popup.transient(self.interior()) g = self.geometry() d = g.split('+')[1:] popup.geometry("+%s+%s" % (d[0],d[1])) def position_over (self, gui_parent): "Position this dialog over the gui_parent" g = gui_parent.geometry() d = g.split('+')[1:] self.geometry("+%s+%s" % (d[0],d[1])) def execute (self, name): if name is None: self.destroy() return def destroy (self): global _root for i in range(len(_dialogs)): if _dialogs[i] is self: del _dialogs[i] break self.dialog.destroy() if self.am_root: _root.destroy() _root = None def add_balloon_help (menu, menu_title): "Add a balloon help toggle to menu." menu.addmenuitem(menu_title, 'checkbutton', 'Toggle balloon help on/off', label = 'Show Balloons', variable = _balloon_var, command = toggle_balloon_state )