| """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() |