实现随光标移动动态更新的Tkinter tooltip显示Matplotlib绘图X值
实现随光标移动的动态Tooltip(显示Matplotlib绘图X值)
核心方案
通过Tkinter的Toplevel组件创建无框浮动tooltip,绑定Matplotlib画布的鼠标事件,实时转换坐标并更新tooltip的内容与位置,实现跟随光标的动态显示效果。
完整代码
import tkinter as tk from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg from matplotlib.figure import Figure from matplotlib.widgets import Cursor import numpy as np root = tk.Tk() root.title("动态Tooltip演示") Fs = 8000 f = 5 sample = 8000 x = np.arange(sample) y = np.sin(2 * np.pi * f * x / Fs) figure = Figure(figsize=(5, 4), dpi=100) plot = figure.add_subplot(1, 1, 1) plot.plot(x, y, color="blue") canvas = FigureCanvasTkAgg(figure, root) canvas_widget = canvas.get_tk_widget() canvas_widget.grid(column=0, row=3, columnspan=4, pady=4, padx=4) # 创建浮动tooltip窗口 tooltip = tk.Toplevel(root) tooltip.wm_overrideredirect(True) # 隐藏窗口边框 tooltip.withdraw() # 初始状态隐藏 tooltip_label = tk.Label(tooltip, text="X值: 0", bg="lightyellow", padx=2, pady=1, relief=tk.SOLID) tooltip_label.pack() # 鼠标移动事件处理 def on_mouse_move(event): if event.inaxes == plot: # 将画布像素坐标转换为绘图X轴实际数据 x_val = int(canvas.canvasx(event.x)) tooltip_label.config(text=f"X值: {x_val}") # 设置tooltip位置,偏移光标避免遮挡 tooltip.geometry(f"+{root.winfo_pointerx()+10}+{root.winfo_pointery()+10}") tooltip.deiconify() else: tooltip.withdraw() # 绑定鼠标事件 canvas.mpl_connect('motion_notify_event', on_mouse_move) canvas.mpl_connect('axes_leave_event', lambda e: tooltip.withdraw()) # 保留原有的按钮和Matplotlib Cursor B = tk.Button(root, text="Cursor样式演示", relief=tk.RAISED, cursor="coffee_mug", width=25) B.grid(column=0, row=4, columnspan=5, padx=4, pady=4) cursor = Cursor(plot, useblit=True, horizOn=False, vertOn=True, color="green", linewidth=2.0) root.mainloop()
关键细节说明
- 浮动窗口设置:
wm_overrideredirect(True)让tooltip成为无框悬浮窗口,避免干扰主界面布局 - 坐标转换:
canvas.canvasx(event.x)将Tkinter的像素坐标转换为Matplotlib绘图的X轴真实数据值 - 事件监听:
motion_notify_event:鼠标在绘图区域移动时,实时更新tooltip的内容和位置axes_leave_event:鼠标离开绘图区域时自动隐藏tooltip
- 位置优化:tooltip位置偏移光标10像素,避免遮挡光标本身
内容的提问来源于stack exchange,提问作者Lachlan
相关产品推荐
相关产品推荐

