-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtooltip.py
98 lines (81 loc) · 2.9 KB
/
tooltip.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
from tkinter import Label as tkLabel
from tkinter import Toplevel, TclError
class Tooltip:
def __init__(self, widget, text, delay=750, duration=1500):
self.widget = widget
self._tooltip = None
self._hide_id = None
self._render_id = None
self._tooltip_text = text
self._tooltip_delay = delay
self._tooltip_duration = duration
self._enter_bind = self.widget.bind("<Enter>", self.show)
self._leave_bind = self.widget.bind("<Leave>", self.hide)
self._button_bind = self.widget.bind("<Button>", self.hide)
def __del__(self):
try:
self.widget.unbind("<Enter>", self._enter_bind)
self.widget.unbind("<Leave>", self._leave_bind)
self.widget.unbind("<Button>", self._button_bind)
except TclError:
pass
def show(self, _):
def render():
if not self._tooltip:
self._tooltip = tw = Toplevel(self.widget)
tw.wm_overrideredirect(True)
x, y = 20, self.widget.winfo_height() + 1
root_x = self.widget.winfo_rootx() + x
root_y = self.widget.winfo_rooty() + y
self._tooltip.wm_geometry("+%d+%d" % (root_x, root_y))
label = tkLabel(
self._tooltip,
text=self._tooltip_text,
justify='left',
background="#ffffe0",
relief='solid',
borderwidth=1
)
label.pack()
self._tooltip.update_idletasks() # Needed on MacOS -- see #34275.
self._tooltip.lift()
self._hide_id = self.widget.after(self._tooltip_duration, self.hide)
if self._tooltip_delay:
if self._render_id:
self.widget.after_cancel(self._render_id)
self._render_id = self.widget.after(self._tooltip_delay, render)
else:
render()
def hide(self, _=None):
try:
if self._hide_id:
self.widget.after_cancel(self._hide_id)
if self._render_id:
self.widget.after_cancel(self._render_id)
except TclError:
pass
tooltip = self._tooltip
if self._tooltip:
try:
tooltip.destroy()
except TclError:
pass
self._tooltip = None
@property
def delay(self):
return self._tooltip_delay
@delay.setter
def delay(self, value):
self._tooltip_delay = value
@property
def duration(self):
return self._tooltip_duration
@duration.setter
def duration(self, value):
self._tooltip_duration = value
@property
def tooltip_text(self):
return self._tooltip_text
@tooltip_text.setter
def tooltip_text(self, value):
self._tooltip_text = value