|
1 # general purpose 'tooltip' routines - currently unused in idlefork |
|
2 # (although the 'calltips' extension is partly based on this code) |
|
3 # may be useful for some purposes in (or almost in ;) the current project scope |
|
4 # Ideas gleaned from PySol |
|
5 |
|
6 from Tkinter import * |
|
7 |
|
8 class ToolTipBase: |
|
9 |
|
10 def __init__(self, button): |
|
11 self.button = button |
|
12 self.tipwindow = None |
|
13 self.id = None |
|
14 self.x = self.y = 0 |
|
15 self._id1 = self.button.bind("<Enter>", self.enter) |
|
16 self._id2 = self.button.bind("<Leave>", self.leave) |
|
17 self._id3 = self.button.bind("<ButtonPress>", self.leave) |
|
18 |
|
19 def enter(self, event=None): |
|
20 self.schedule() |
|
21 |
|
22 def leave(self, event=None): |
|
23 self.unschedule() |
|
24 self.hidetip() |
|
25 |
|
26 def schedule(self): |
|
27 self.unschedule() |
|
28 self.id = self.button.after(1500, self.showtip) |
|
29 |
|
30 def unschedule(self): |
|
31 id = self.id |
|
32 self.id = None |
|
33 if id: |
|
34 self.button.after_cancel(id) |
|
35 |
|
36 def showtip(self): |
|
37 if self.tipwindow: |
|
38 return |
|
39 # The tip window must be completely outside the button; |
|
40 # otherwise when the mouse enters the tip window we get |
|
41 # a leave event and it disappears, and then we get an enter |
|
42 # event and it reappears, and so on forever :-( |
|
43 x = self.button.winfo_rootx() + 20 |
|
44 y = self.button.winfo_rooty() + self.button.winfo_height() + 1 |
|
45 self.tipwindow = tw = Toplevel(self.button) |
|
46 tw.wm_overrideredirect(1) |
|
47 tw.wm_geometry("+%d+%d" % (x, y)) |
|
48 self.showcontents() |
|
49 |
|
50 def showcontents(self, text="Your text here"): |
|
51 # Override this in derived class |
|
52 label = Label(self.tipwindow, text=text, justify=LEFT, |
|
53 background="#ffffe0", relief=SOLID, borderwidth=1) |
|
54 label.pack() |
|
55 |
|
56 def hidetip(self): |
|
57 tw = self.tipwindow |
|
58 self.tipwindow = None |
|
59 if tw: |
|
60 tw.destroy() |
|
61 |
|
62 class ToolTip(ToolTipBase): |
|
63 def __init__(self, button, text): |
|
64 ToolTipBase.__init__(self, button) |
|
65 self.text = text |
|
66 def showcontents(self): |
|
67 ToolTipBase.showcontents(self, self.text) |
|
68 |
|
69 class ListboxToolTip(ToolTipBase): |
|
70 def __init__(self, button, items): |
|
71 ToolTipBase.__init__(self, button) |
|
72 self.items = items |
|
73 def showcontents(self): |
|
74 listbox = Listbox(self.tipwindow, background="#ffffe0") |
|
75 listbox.pack() |
|
76 for item in self.items: |
|
77 listbox.insert(END, item) |
|
78 |
|
79 def main(): |
|
80 # Test code |
|
81 root = Tk() |
|
82 b = Button(root, text="Hello", command=root.destroy) |
|
83 b.pack() |
|
84 root.update() |
|
85 tip = ListboxToolTip(b, ["Hello", "world"]) |
|
86 root.mainloop() |
|
87 |
|
88 if __name__ == '__main__': |
|
89 main() |