• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    python matplotlib工具栏源码探析二之添加、删除内置工具项的案例

    从matplotlib工具栏源码探析一(禁用工具栏、默认工具栏和工具栏管理器三种模式的差异)一文可知matplotlib内置实现了多个工具项的实现,而默认工具栏中的工具项只是其中的一部分,有没有方法直接管理工具栏,添加、删除内置工具项?

    matplotlib内置的工具项

    由源码可知,matplotlib.backend_tools.default_tools变量为字典类型,实例化了基于matplotlib.backend_tools.ToolBase类定义的内置工具项。

    源码

    default_tools = {'home': ToolHome, 'back': ToolBack, 'forward': ToolForward,
         'zoom': ToolZoom, 'pan': ToolPan,
         'subplots': 'ToolConfigureSubplots',
         'save': 'ToolSaveFigure',
         'grid': ToolGrid,
         'grid_minor': ToolMinorGrid,
         'fullscreen': ToolFullScreen,
         'quit': ToolQuit,
         'quit_all': ToolQuitAll,
         'allnav': _ToolEnableAllNavigation,
         'nav': _ToolEnableNavigation,
         'xscale': ToolXScale,
         'yscale': ToolYScale,
         'position': ToolCursorPosition,
         _views_positions: ToolViewsPositions,
         'cursor': 'ToolSetCursor',
         'rubberband': 'ToolRubberband',
         'help': 'ToolHelp',
         'copy': 'ToolCopyToClipboard',
         }

    验证

    import matplotlib.pyplot as plt
    import matplotlib as mpl
    from pprint import pprint
    
    plt.rcParams['toolbar'] = 'toolmanager'
    fig = plt.gcf()
    pprint(mpl.backend_tools.default_tools)

    输出

    {'allnav': class 'matplotlib.backend_tools._ToolEnableAllNavigation'>,
     'back': class 'matplotlib.backend_tools.ToolBack'>,
     'copy': 'ToolCopyToClipboard',
     'cursor': 'ToolSetCursor',
     'forward': class 'matplotlib.backend_tools.ToolForward'>,
     'fullscreen': class 'matplotlib.backend_tools.ToolFullScreen'>,
     'grid': class 'matplotlib.backend_tools.ToolGrid'>,
     'grid_minor': class 'matplotlib.backend_tools.ToolMinorGrid'>,
     'help': 'ToolHelp',
     'home': class 'matplotlib.backend_tools.ToolHome'>,
     'nav': class 'matplotlib.backend_tools._ToolEnableNavigation'>,
     'pan': class 'matplotlib.backend_tools.ToolPan'>,
     'position': class 'matplotlib.backend_tools.ToolCursorPosition'>,
     'quit': class 'matplotlib.backend_tools.ToolQuit'>,
     'quit_all': class 'matplotlib.backend_tools.ToolQuitAll'>,
     'rubberband': 'ToolRubberband',
     'save': 'ToolSaveFigure',
     'subplots': 'ToolConfigureSubplots',
     'viewpos': class 'matplotlib.backend_tools.ToolViewsPositions'>,
     'xscale': class 'matplotlib.backend_tools.ToolXScale'>,
     'yscale': class 'matplotlib.backend_tools.ToolYScale'>,
     'zoom': class 'matplotlib.backend_tools.ToolZoom'>}

    使用工具栏管理器管理内置工具项

    由源码可知默认工具栏模式toolbar2模式没有提供添加、删除工具项的接口。因此,管理工具栏需要使用工具栏管理器模式toolmanager,与该模式相关的重要定义有:

    使用系统函数实现添加工具项

    根据源码可知,matplotlib.backend_tools.add_tools_to_container函数可以设置toolbarmanager模式默认工具栏。

    案例

    案例说明:为工具栏添加全屏切换工具项。

    import matplotlib.pyplot as plt
    import matplotlib as mpl
    
    plt.rcParams['toolbar'] = 'toolmanager'
    fig = plt.gcf()
    # 通过mpl.backend_tools.add_tools_to_container函数添加工具项
    mpl.backend_tools.add_tools_to_container(fig.canvas.manager.toolbar, tools=[['foo', [ 'fullscreen']]])
    plt.show()

    案例解析:add_tools_to_container函数有两个参数containertools,由源码可知container参数的值应为fig.canvas.manager.toolbartools参数按照[[分组1, [工具1, 工具2 ...]], [分组2, [...]]]格式取值。

    使用工具栏管理器实现添加、删除内置工具项

    根据源码可知:

    添加内置工具项有两种方法

    案例

    案例说明:删除向前工具项,添加全屏切换工具项。

    import matplotlib.pyplot as plt
    import matplotlib as mpl
    
    plt.rcParams['toolbar'] = 'toolmanager'
    fig = plt.gcf()
    
    fig.canvas.manager.toolmanager.remove_tool('forward')
    fig.canvas.manager.toolbar.remove_toolitem('back')
    fig.canvas.manager.toolbar.add_tool('quit', 'foo')
    fig.canvas.manager.toolbar.add_toolitem('fullscreen', 'foo', -1,'fullscreen','fullscreen',False) 
    
    plt.show()

    总结

    通过工具栏管理器添加、删除内置工具项的方法很多种,需要注意调用对象、方法、参数,阅读下面的matplotlib源码可能会有所启发。

    相关源码

    matplotlib.backends.backend_qt5模块

    class FigureManagerQT(FigureManagerBase):
     self.toolbar = self._get_toolbar(self.canvas, self.window)
    
     if self.toolmanager:
      backend_tools.add_tools_to_manager(self.toolmanager)
      if self.toolbar:
       backend_tools.add_tools_to_container(self.toolbar)
    
     if self.toolbar:
      self.window.addToolBar(self.toolbar)
      tbs_height = self.toolbar.sizeHint().height()
     else:
      tbs_height = 0
     def _get_toolbar(self, canvas, parent):
      # must be inited after the window, drawingArea and figure
      # attrs are set
      if matplotlib.rcParams['toolbar'] == 'toolbar2':
       toolbar = NavigationToolbar2QT(canvas, parent, True)
      elif matplotlib.rcParams['toolbar'] == 'toolmanager':
       toolbar = ToolbarQt(self.toolmanager, self.window)
      else:
       toolbar = None
      return toolbar
     class ToolbarQt(ToolContainerBase, QtWidgets.QToolBar):
     def __init__(self, toolmanager, parent):
      ToolContainerBase.__init__(self, toolmanager)
      QtWidgets.QToolBar.__init__(self, parent)
      self.setAllowedAreas(
       QtCore.Qt.TopToolBarArea | QtCore.Qt.BottomToolBarArea)
      message_label = QtWidgets.QLabel("")
      message_label.setAlignment(
       QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
      message_label.setSizePolicy(
       QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding,
             QtWidgets.QSizePolicy.Ignored))
      self._message_action = self.addWidget(message_label)
      self._toolitems = {}
      self._groups = {}
    
     def add_toolitem(
       self, name, group, position, image_file, description, toggle):
    
      button = QtWidgets.QToolButton(self)
      if image_file:
       button.setIcon(NavigationToolbar2QT._icon(self, image_file))
      button.setText(name)
      if description:
       button.setToolTip(description)
    
      def handler():
       self.trigger_tool(name)
      if toggle:
       button.setCheckable(True)
       button.toggled.connect(handler)
      else:
       button.clicked.connect(handler)
    
      self._toolitems.setdefault(name, [])
      self._add_to_group(group, name, button, position)
      self._toolitems[name].append((button, handler))
    
     def _add_to_group(self, group, name, button, position):
      gr = self._groups.get(group, [])
      if not gr:
       sep = self.insertSeparator(self._message_action)
       gr.append(sep)
      before = gr[position]
      widget = self.insertWidget(before, button)
      gr.insert(position, widget)
      self._groups[group] = gr
    
     def toggle_toolitem(self, name, toggled):
      if name not in self._toolitems:
       return
      for button, handler in self._toolitems[name]:
       button.toggled.disconnect(handler)
       button.setChecked(toggled)
       button.toggled.connect(handler)
    
     def remove_toolitem(self, name):
      for button, handler in self._toolitems[name]:
       button.setParent(None)
      del self._toolitems[name]
    
     def set_message(self, s):
      self.widgetForAction(self._message_action).setText(s

    matplotlib.backend_tools模块

    def add_tools_to_container(container, tools=default_toolbar_tools):
     """
     Add multiple tools to the container.
    
     Parameters
     ----------
     container : Container
      `backend_bases.ToolContainerBase` object that will get the tools added.
     tools : list, optional
      List in the form ``[[group1, [tool1, tool2 ...]], [group2, [...]]]``
      where the tools ``[tool1, tool2, ...]`` will display in group1.
      See `add_tool` for details.
     """
    
     for group, grouptools in tools:
      for position, tool in enumerate(grouptools):
       container.add_tool(tool, group, position)
    def add_tools_to_manager(toolmanager, tools=default_tools):
     """
     Add multiple tools to a `.ToolManager`.
    
     Parameters
     ----------
     toolmanager : `.backend_managers.ToolManager`
      Manager to which the tools are added.
     tools : {str: class_like}, optional
      The tools to add in a {name: tool} dict, see `add_tool` for more
      info.
     """
    
     for name, tool in tools.items():
      toolmanager.add_tool(name, tool)

    到此这篇关于python matplotlib工具栏源码探析二之添加、删除内置工具项的案例的文章就介绍到这了,更多相关python matplotlib内置工具项内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • Python matplotlib实用绘图技巧汇总
    • python使用matplotlib显示图像失真的解决方案
    • 基于python的matplotlib制作双Y轴图
    • 用Python的绘图库(matplotlib)绘制小波能量谱
    • python matplotlib绘图实现删除重复冗余图例的操作
    • Python基础之画图神器matplotlib
    • python读取并显示图片的三种方法(opencv、matplotlib、PIL库)
    • python 如何在 Matplotlib 中绘制垂直线
    • 利用Python matplotlib绘制风能玫瑰图
    • python 绘图模块matplotlib的使用简介
    • python之 matplotlib和pandas绘图教程
    • Python绘图库Matplotlib的基本用法
    上一篇:python matplotlib工具栏源码探析三之添加、删除自定义工具项的案例详解
    下一篇:使用tkinter实现三子棋游戏
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    python matplotlib工具栏源码探析二之添加、删除内置工具项的案例 python,matplotlib,工具栏,源码,