如何检测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
相关产品推荐
相关产品推荐

