| # 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): |
| # SF bug 546078: IDLE calltips cause application error. |
| # There were crashes on various Windows flavors, and even a |
| # crashing X server on Linux, with very long calltips. |
| 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) |
| tw.wm_overrideredirect(1) |
| tw.wm_geometry("+%d+%d" % (x, y)) |
| 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() # not in idle |
| |
| 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() |