Tkinter Button bind hover message

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()
相关推荐
恋恋西风1 小时前
C++ 理解 std::thread 在单核和多核上的行为差异
开发语言·c++
Brilliantwxx1 小时前
【Linux】 进程(9)程序与进程地址空间(基础+进阶+面试题)
linux·运维·服务器·开发语言·c++
BizzZ_2 小时前
C++(22)——类型转换和IO流
开发语言·c++
小范同学_2 小时前
JDK1.7 与 JDK1.8 HashMap 底层原理对比 + 数组并发扩容死循环详解
java·开发语言
geovindu2 小时前
CSharp: 万年历
开发语言·后端·c#·.net
傲笑风2 小时前
【openvino】tinybert基于openvino服务化部署(四)
人工智能·python·自然语言处理·nlp·bert·openvino
我找到地球的支点啦3 小时前
Matlab系列(009) 一CRC循环冗余校验详解
开发语言·数据结构·算法·matlab·信息与通信
维基框架3 小时前
WIKI 知识库 v1.1.1 正式发布
人工智能·python
予昊3 小时前
从零实现“在线五子棋对战“:WebSocket 实时通信 + 段位匹配
java·开发语言·网络·websocket
weixin_461408583 小时前
Mybatis-flex小记
java·开发语言·mybatis