Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 子类化matplotlib NavigationToolbar会引发平移/缩放错误_Python_Qt_Matplotlib_Pyqt_Qaction - Fatal编程技术网

Python 子类化matplotlib NavigationToolbar会引发平移/缩放错误

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):

我正在开发一个基于GUI的过滤器设计和分析工具(),将matplotlib NavigationToolbar子类化,以实现一些更改(添加/删除的函数和按钮,新的图标集)。完整代码可在下获得。每个(选项卡式)plot_*小部件实例化子类NavigationToolbar的一个副本,例如来自plot_小部件/plot_phi.py:

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)
总的来说,这很有效,但是

  • 。。。函数“平移/缩放”和“缩放矩形”抛出以下错误(但缩放和平移仍然存在)。 回溯(最近一次呼叫最后一次):

    鼠标修改器x和y不起作用,并且无论是否选择该功能,也没有视觉提示。我必须承认,我不太了解组合函数pan/zoom的接口(QAction?),我还不是一个经验丰富的Pythonista

  • …我的新功能“缩放全视图”有效,但无法使用“上一个/下一个视图”撤消缩放设置。这并不奇怪,因为我没有将视图设置添加到视图设置列表(?)中,不知道从哪里开始:-)

  • 谁能给我一个关于如何正确应用导航工具栏的小提示呢

    还有(无耻插头:-):有人愿意为这个项目捐款吗?接下来的步骤将是VHDL/Verilog-使用myHDL()导出和保存/加载过滤器功能

    这是plot\u widgets/plot\u utils.py中的一个经过修剪的片段

    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()