Commit | Line | Data |
---|---|---|
920dae64 AT |
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 | ||
87 | # root.mainloop() # not in idle | |
88 | ||
89 | main() |