text: """A CallTip window class for Tkinter/IDLE.
  
  After ToolTip.py, which uses ideas gleaned from PySol
  Used by the CallTips IDLE extension.
  
  """
  from Tkinter import *
  
  class CallTip:
  
      def __init__(self, widget):
          self.widget = widget
          self.tipwindow = None
          self.id = None
          self.x = self.y = 0
  
      def showtip(self, text):
          " Display text in calltip window"
          # truncate overly long calltip
          if len(text) >= 79:
              text = text[:75] + ' ...'
          self.text = text
          if self.tipwindow or not self.text:
              return
          self.widget.see("insert")
          x, y, cx, cy = self.widget.bbox("insert")
          x = x + self.widget.winfo_rootx() + 2
          y = y + cy + self.widget.winfo_rooty()
          self.tipwindow = tw = Toplevel(self.widget)
          # XXX 12 Dec 2002 KBK The following command has two effects: It removes
          #     the calltip window border (good) but also causes (at least on
          #     Linux) the calltip to show as a top level window, burning through
          #     any other window dragged over it.  Also, shows on all viewports!
          tw.wm_overrideredirect(1)
          tw.wm_geometry("+%d+%d" % (x, y))
          try:
              # This command is only needed and available on Tk >= 8.4.0 for OSX
              # Without it, call tips intrude on the typing process by grabbing
              # the focus.
              tw.tk.call("::tk::unsupported::MacWindowStyle", "style", tw._w,
                         "help", "noActivates")
          except TclError:
              pass
          label = Label(tw, text=self.text, justify=LEFT,
                        background="#ffffe0", relief=SOLID, borderwidth=1,
                        font = self.widget['font'])
          label.pack()
  
      def hidetip(self):
          tw = self.tipwindow
          self.tipwindow = None
          if tw:
              tw.destroy()
  
  
  ###############################
  #
  # Test Code
  #
  class container: # Conceptually an editor_window
      def __init__(self):
          root = Tk()
          text = self.text = Text(root)
          text.pack(side=LEFT, fill=BOTH, expand=1)
          text.insert("insert", "string.split")
          root.update()
          self.calltip = CallTip(text)
  
          text.event_add("<<calltip-show>>", "(")
          text.event_add("<<calltip-hide>>", ")")
          text.bind("<<calltip-show>>", self.calltip_show)
          text.bind("<<calltip-hide>>", self.calltip_hide)
  
          text.focus_set()
          root.mainloop()
  
      def calltip_show(self, event):
          self.calltip.showtip("Hello world")
  
      def calltip_hide(self, event):
          self.calltip.hidetip()
  
  def main():
      # Test code
      c=container()
  
  if __name__=='__main__':
      main()
  