Source code for gui_image_studio.image_studio.utils.tooltip
"""
Tooltip utility for widgets.
"""
import tkinter as tk
from typing import Optional
[docs]
class ToolTip:
"""Simple tooltip class for widgets."""
def __init__(self, widget: tk.Widget, text: str) -> None:
self.widget = widget
self.text = text
self.tooltip_window = None
self.widget.bind("<Enter>", self.on_enter)
self.widget.bind("<Leave>", self.on_leave)
[docs]
def on_enter(self, event: Optional[tk.Event] = None) -> None:
"""Show tooltip on mouse enter."""
if self.tooltip_window or not self.text:
return
# Get widget position for tooltip placement
try:
# For text widgets, try to get cursor position
if isinstance(self.widget, tk.Text) and hasattr(self.widget, "bbox"):
bbox = self.widget.bbox("insert")
if bbox:
x, y, _, _ = bbox
else:
x, y = 0, 0
elif isinstance(self.widget, tk.Entry) and hasattr(self.widget, "bbox"):
# For Entry widgets, bbox also supports "insert"
bbox = self.widget.bbox("insert")
if bbox:
x, y, _, _ = bbox
else:
x, y = 0, 0
else:
# For other widgets, use default position
x, y = 0, 0
except (tk.TclError, TypeError, AttributeError):
# Fallback if bbox fails
x, y = 0, 0
x += self.widget.winfo_rootx() + 20
y += self.widget.winfo_rooty() + 20
self.tooltip_window = tw = tk.Toplevel(self.widget)
tw.wm_overrideredirect(True)
tw.wm_geometry(f"+{x}+{y}")
label = tk.Label(
tw,
text=self.text,
justify=tk.LEFT,
background="#ffffe0",
relief=tk.SOLID,
borderwidth=1,
font=("Arial", 8),
)
label.pack(ipadx=1)
[docs]
def on_leave(self, event: Optional[tk.Event] = None) -> None:
"""Hide tooltip on mouse leave."""
if self.tooltip_window:
self.tooltip_window.destroy()
self.tooltip_window = None
return