NavigationToolbar2TkAgg已弃用:咨询替代方案及弃用原因
嘿,这个弃用警告我之前在项目里也碰到过,给你拆解一下原因和替代方案:
为什么NavigationToolbar2TkAgg会被弃用?
Matplotlib从2.2版本开始对Tk后端的导航工具栏进行了API重构,核心原因有两点:
- 原类
NavigationToolbar2TkAgg是绑定特定后端(TkAgg)的专属实现,类名里带有后端标识,API不够通用,切换后端时需要修改对应代码 - 官方希望统一不同后端的工具栏接口,简化API结构,降低用户的学习成本和代码维护难度
应该用什么替代?
直接使用重构后的**NavigationToolbar2Tk**类即可,它是官方推荐的替代方案,功能和原NavigationToolbar2TkAgg完全一致,但API更简洁通用,不再绑定特定后端标识。
修改后的完整代码示例
顺便提个小细节:matplotlib.use('TkAgg')最好放在导入matplotlib其他模块的最开头,避免潜在的后端加载问题。以下是调整后的完整代码:
import tkinter as tk # 先设置后端再导入matplotlib相关模块 matplotlib.use('TkAgg') import matplotlib import matplotlib.pyplot as plt import matplotlib.figure import matplotlib.backends.backend_tkagg import numpy as np def on_key_event(event, canvas, toolbar): matplotlib.backend_bases.key_press_handler(event, canvas, toolbar) root = tk.Tk() root.wm_title('Test window') fig = matplotlib.figure.Figure(figsize=(9.333, 7), dpi=100) a = fig.add_subplot(111) axes = fig.gca() x = np.linspace(0, 2*np.pi, 100) axes.plot(x, np.sin(x), marker='.') axes.set_title('sin(x)') axes.grid() canvas = matplotlib.backends.backend_tkagg.FigureCanvasTkAgg(fig, master=root) canvas.draw() canvas.get_tk_widget().pack(fill=tk.X, expand=1) # 替换为新的工具栏类 toolbar = matplotlib.backends.backend_tkagg.NavigationToolbar2Tk(canvas, root) toolbar.update() canvas.mpl_connect( 'key_press_event', lambda event: on_key_event(event, canvas, toolbar) ) root.bind('<Control-w>', lambda event: root.destroy()) tk.mainloop()
这样修改后,弃用警告就会消失,代码功能和原来完全一致~
内容的提问来源于stack exchange,提问作者Håkon Hægland
相关产品推荐
相关产品推荐

