This is the hover message (tooltip-style) behavior into a reusable class is the right way to go.
python
import tkinter as tk
class HoverTooltip:
"""A reusable tooltip class for Tkinter widgets."""
def __init__(self, widget, text, offset=(10, 10)):
self.widget = widget
self.text = text
self.offset = offset
self.tooltip = None
# Bind hover events
widget.bind("<Enter>", self.show_tooltip)
widget.bind("<Leave>", self.hide_tooltip)
widget.bind("<Motion>", self.move_tooltip)
def show_tooltip(self, event):
"""Display the tooltip near the cursor."""
if self.tooltip or not self.text:
return
self.tooltip = tk.Toplevel(self.widget)
self.tooltip.wm_overrideredirect(True) # no window borders
self.tooltip.attributes("-topmost", True)
label = tk.Label(
self.tooltip,
text=self.text,
bg="yellow",
relief="solid",
borderwidth=1,
padx=5,
pady=2,
)
label.pack(ipadx=1)
# Position the tooltip initially
self.move_tooltip(event)
def move_tooltip(self, event):
"""Update tooltip position as the cursor moves."""
if self.tooltip:
x = event.x_root + self.offset[0]
y = event.y_root + self.offset[1]
self.tooltip.geometry(f"+{x}+{y}")
def hide_tooltip(self, event):
"""Destroy the tooltip when cursor leaves."""
if self.tooltip:
self.tooltip.destroy()
self.tooltip = None
# --- Example usage ---
if __name__ == "__main__":
root = tk.Tk()
root.title("Hover Tooltip Class Example")
btn1 = tk.Button(root, text="Hover Me 1")
btn1.pack(pady=10)
btn2 = tk.Button(root, text="Hover Me 2")
btn2.pack(pady=10)
HoverTooltip(btn1, "This is the first button tooltip!")
HoverTooltip(btn2, "Another helpful message here!")
root.mainloop()
Another simple way
python
# Import the tkinter library
from tkinter import *
from tkinter.tix import *
# Create an instance of tkinter frame
win = Tk()
# Set the geometry
win.geometry("400x200")
# Create a tooltip
tip = Balloon(win)
# Create a Button widget
my_button = Button(win, text="Python", font=('Helvetica bold', 20))
my_button.pack(pady=20)
# Bind the tooltip with button
tip.bind_widget(my_button, balloonmsg="Python is an interpreted, high-level and general-purpose programming language")
win.mainloop()