-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtooltip.py
More file actions
49 lines (42 loc) · 1.55 KB
/
tooltip.py
File metadata and controls
49 lines (42 loc) · 1.55 KB
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
import tkinter as tk
from typing import Optional, Any
class ToolTip:
"""A tooltip that appears when hovering over a widget."""
def __init__(self, widget: tk.Widget, text: str, delay: int = 500):
self.widget = widget
self.text = text
self.delay = delay
self.tip_window: Optional[tk.Toplevel] = None
self.id = ""
self.widget.bind("<Enter>", self.schedule)
self.widget.bind("<Leave>", self.unschedule)
def schedule(self, event: Optional[Any] = None):
self.unschedule()
self.id = self.widget.after(self.delay, self.show_tip)
def unschedule(self, event: Optional[Any] = None):
if self.id:
self.widget.after_cancel(self.id)
self.id = ""
self.hide_tip()
def show_tip(self, event: Optional[Any] = None):
if self.tip_window or not self.text:
return
x = self.widget.winfo_rootx() + self.widget.winfo_width() // 2
y = self.widget.winfo_rooty() + self.widget.winfo_height()
self.tip_window = tk.Toplevel(self.widget)
self.tip_window.wm_overrideredirect(True)
self.tip_window.wm_geometry(f"+{x}+{y}")
label = tk.Label(
self.tip_window,
text=self.text,
justify=tk.LEFT,
background="#FFFFE0",
relief=tk.SOLID,
borderwidth=1,
font=("Segoe UI", 10)
)
label.pack(ipadx=1)
def hide_tip(self):
if self.tip_window:
self.tip_window.destroy()
self.tip_window = None