如何为Tkinter GUI内嵌Matplotlib图添加悬浮坐标显示光标
解决方法
导致光标不生效的核心原因是Cursor实例被Python垃圾回收机制自动清理,你可以按如下步骤修正:
- 首先确认你导入的是matplotlib官方的光标组件:
from matplotlib.widgets import Cursor - 不要把Cursor定义为局部变量,需要用全局变量或者类实例属性持有它,保证它的生命周期和绘图窗口一致
plot本身就是add_subplot()返回的Axes实例,直接作为ax参数传入即可,不需要额外取.axes属性
修正后可运行的完整代码示例:
from matplotlib.widgets import Cursor import tkinter as tk from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg from matplotlib.figure import Figure root = tk.Tk() x = [1,2,3,4,5] y = [2,4,1,5,3] Date = "数据日期" figure = Figure(figsize=(5, 4), dpi=100) plot = figure.add_subplot(1, 1, 1) figure.suptitle(Date, fontsize=12) plot.plot(x, y, color="blue") # 持有Cursor实例,若写在类中则赋值给self.cursor即可 global cursor cursor = Cursor(plot, horizOn=True, vertOn=False, color="green", linewidth=2.0) # 若需要额外显示坐标数值,可添加以下绑定逻辑 coord_text = figure.text(0.15, 0.92, '', fontsize=10) def on_mouse_move(event): if event.inaxes == plot: coord_text.set_text(f'x={event.xdata:.2f}, y={event.ydata:.2f}') else: coord_text.set_text('') canvas.draw_idle() canvas = FigureCanvasTkAgg(figure, root) canvas.mpl_connect('motion_notify_event', on_mouse_move) canvas.get_tk_widget().grid(column=0, row=3,columnspan=4,pady = 4, padx=4) root.mainloop()
内容的提问来源于stack exchange,提问作者Joe_bart
相关产品推荐
相关产品推荐

