import tkinter as tk from tkinter import ttk from typing import Optional from core.gui.themes import Styles class Tooltip(object): """ Create tool tip for a given widget """ def __init__(self, widget: tk.BaseWidget, text: str = "widget info") -> None: self.widget: tk.BaseWidget = widget self.text: str = text self.widget.bind("", self.on_enter) self.widget.bind("", self.on_leave) self.waittime: int = 400 self.id: Optional[str] = None self.tw: Optional[tk.Toplevel] = None def on_enter(self, event: tk.Event = None) -> None: self.schedule() def on_leave(self, event: tk.Event = None) -> None: self.unschedule() self.close(event) def schedule(self): self.unschedule() self.id = self.widget.after(self.waittime, self.enter) def unschedule(self): id_ = self.id self.id = None if id_: self.widget.after_cancel(id_) def enter(self, event: tk.Event = None): x, y, cx, cy = self.widget.bbox("insert") x += self.widget.winfo_rootx() y += self.widget.winfo_rooty() + 32 self.tw = tk.Toplevel(self.widget) self.tw.wm_overrideredirect(True) self.tw.wm_geometry("+%d+%d" % (x, y)) self.tw.rowconfigure(0, weight=1) self.tw.columnconfigure(0, weight=1) frame = ttk.Frame(self.tw, style=Styles.tooltip_frame, padding=3) frame.grid(sticky=tk.NSEW) label = ttk.Label(frame, text=self.text, style=Styles.tooltip) label.grid() def close(self, event: tk.Event = None): if self.tw: self.tw.destroy()