You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NavigationToolbar2TkAgg已弃用:咨询替代方案及弃用原因

关于Matplotlib 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:36:35