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

如何检测Matplotlib导航栏平移与缩放工具的切换状态

实现场景

基于PyQt5自定义MplWidget类,内嵌Matplotlib画布与官方导航栏,实现代码如下:

from PyQt5.QtWidgets import QWidget, QVBoxLayout
from matplotlib.backends.backend_qt5agg import (FigureCanvasQTAgg as
        FigureCanvas, NavigationToolbar2QT as NavigationToolbar)
from matplotlib.figure import Figure


class MplWidget(QWidget):

    def __init__(self, parent=None):
        QWidget.__init__(self, parent)

        self.canvas = FigureCanvas(Figure())
        vertical_layout = QVBoxLayout()
        vertical_layout.addWidget(self.canvas)

        self.canvas.axes = self.canvas.figure.add_subplot(111)
        self.setLayout(vertical_layout)
        self.canvas.toolbar = NavigationToolbar(self.canvas, self)
        self.layout().addWidget(self.canvas.toolbar)
        self.layout().addWidget(self.canvas)
        self.canvas.axes.grid(b=True, which='both', axis='both')
        self.canvas.figure.set_tight_layout(True)
遇到的问题

需要检测导航栏平移(pan)、缩放(zoom)工具的切换激活状态。尝试调用self.canvas.toolbar.get_state()['_current_action']接口时,运行抛出属性错误:

AttributeError: 'NavigationToolbar2QT' object has no attribute 'get_state'

缩放工具激活状态参考示意图:
缩放工具激活状态示意图

解决方法

get_state()是Matplotlib部分非Qt后端导航栏的方法,NavigationToolbar2QT直接暴露了两个公开布尔属性标识工具激活状态,可直接读取:

  • 平移工具状态:self.canvas.toolbar.pan_active,值为True时代表平移工具当前处于激活状态
  • 缩放工具状态:self.canvas.toolbar.zoom_active,值为True时代表缩放工具当前处于激活状态

两个状态互斥,同一时间最多只有一个为True,两者都为False时为默认浏览状态。

如果需要实时监听工具切换动作,可以绑定导航栏的tool_clicked信号,在回调函数中判断状态即可,示例代码:

# 在MplWidget的__init__方法中添加信号绑定
def toolbar_action_triggered(self, tool):
    if self.canvas.toolbar.pan_active:
        # 平移工具激活后的逻辑
        pass
    elif self.canvas.toolbar.zoom_active:
        # 缩放工具激活后的逻辑
        pass
    else:
        # 无工具激活的默认状态逻辑
        pass

self.canvas.toolbar.tool_clicked.connect(toolbar_action_triggered)

内容的提问来源于stack exchange,提问作者Chuck

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 11:48:16