Python 子类化matplotlib NavigationToolbar会引发平移/缩放错误
我正在开发一个基于GUI的过滤器设计和分析工具(),将matplotlib NavigationToolbar子类化,以实现一些更改(添加/删除的函数和按钮,新的图标集)。完整代码可在下获得。每个(选项卡式)plot_*小部件实例化子类NavigationToolbar的一个副本,例如来自plot_小部件/plot_phi.py:Python 子类化matplotlib NavigationToolbar会引发平移/缩放错误,python,qt,matplotlib,pyqt,qaction,Python,Qt,Matplotlib,Pyqt,Qaction,我正在开发一个基于GUI的过滤器设计和分析工具(),将matplotlib NavigationToolbar子类化,以实现一些更改(添加/删除的函数和按钮,新的图标集)。完整代码可在下获得。每个(选项卡式)plot_*小部件实例化子类NavigationToolbar的一个副本,例如来自plot_小部件/plot_phi.py: from plot_widgets.plot_utils import MplWidget class PlotPhi(QtGui.QMainWindow):
from plot_widgets.plot_utils import MplWidget
class PlotPhi(QtGui.QMainWindow):
def __init__(self, parent = None, DEBUG = False): # default parent = None -> top Window
super(PlotPhi, self).__init__(parent)
self.mplwidget = MplWidget()
self.mplwidget.setFocus()
self.setCentralWidget(self.mplwidget)
ax = self.mplwidget.fig.add_subplot(111)
总的来说,这很有效,但是
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar
from matplotlib.backend_bases import cursors as mplCursors
from matplotlib.figure import Figure
class MyMplToolbar(NavigationToolbar):
"""
Custom Matplotlib Navigationtoolbar, subclassed from
NavigationToolbar.
derived from http://www.python-forum.de/viewtopic.php?f=24&t=26437
"""
def _init_toolbar(self):
# self.basedir = os.path.join(rcParams[ 'datapath' ], 'images/icons')
iconDir = os.path.join(os.path.dirname(os.path.abspath(__file__)),
'..','images','icons', '')
# HOME:
a = self.addAction(QtGui.QIcon(iconDir + 'home.svg'), \
'Home', self.home)
a.setToolTip('Reset original view')
# BACK:
a = self.addAction(QtGui.QIcon(iconDir + 'action-undo.svg'), \
'Back', self.back)
a.setToolTip('Back to previous view')
# PAN:
a = self.addAction(QtGui.QIcon(iconDir + 'move.svg'), \
'Pan', self.pan)
# 'Pan', self.pan('self.move','self.pan')) # nearly works ...
a.setToolTip('Pan axes with left mouse button, zoom with right')
# ZOOM RECTANGLE:
a = self.addAction(QtGui.QIcon(iconDir + 'magnifying-glass.svg'), \
'Zoom', self.zoom)
a.setToolTip('Zoom in / out to rectangle with left / right mouse button.')
# Full View:
a = self.addAction(QtGui.QIcon(iconDir + 'fullscreen-enter.svg'), \
'Full View', self.parent.pltFullView)
a.setToolTip('Full view')
self.buttons = {}
# reference holder for subplots_adjust window
self.adj_window = None
使用最初的NavigationToolbar进行反向工程时,我发现了一些缺失的部分:
# PAN:
self.a_pa = self.addAction(QtGui.QIcon(iconDir + 'move.svg'), \
'Pan', self.pan)
self.a_pa.setToolTip('Pan axes with left mouse button, zoom with right')
self._actions['pan'] = self.a_pa
self.a_pa.setCheckable(True)
self.a_pa.setEnabled(True) # enable / disable function programwise
上面的代码消除了错误,并提供了视觉提示(“setCheckable”),指示是否选择了Pan
通过调用
self.myNavigationToolbar.push_current()
更改视图之前(例如,通过自动缩放)
缺少鼠标修改器的解决方案同样简单(当您知道如何解决时,即…),如SO post中所示
问题在于,除非“将qt的焦点激活到mpl画布上”,否则通常不会处理按键事件。解决方案是向MplWidget类添加两行:
self.myNavigationToolbar.push_current()
self.canvas.setFocusPolicy( QtCore.Qt.ClickFocus )
self.canvas.setFocus()