• 售前

  • 售后

热门帖子
入门百科

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

[复制链接]
一叶知秋117 显示全部楼层 发表于 2021-10-25 20:24:22 |阅读模式 打印 上一主题 下一主题
从matplotlib工具栏源码探析一(禁用工具栏、默认工具栏和工具栏管理器三种模式的差别)一文可知
  1. matplotlib
复制代码
内置实现了多个工具项的实现,而默认工具栏中的工具项只是此中的一部分,有没有方法直担当理工具栏,添加、删除内置工具项?
matplotlib内置的工具项

由源码可知,
  1. matplotlib.backend_tools.default_tools
复制代码
变量为字典类型,实例化了基于
  1. matplotlib.backend_tools.ToolBase
复制代码
类界说的内置工具项。
源码
  1. default_tools = {'home': ToolHome, 'back': ToolBack, 'forward': ToolForward,
  2.      'zoom': ToolZoom, 'pan': ToolPan,
  3.      'subplots': 'ToolConfigureSubplots',
  4.      'save': 'ToolSaveFigure',
  5.      'grid': ToolGrid,
  6.      'grid_minor': ToolMinorGrid,
  7.      'fullscreen': ToolFullScreen,
  8.      'quit': ToolQuit,
  9.      'quit_all': ToolQuitAll,
  10.      'allnav': _ToolEnableAllNavigation,
  11.      'nav': _ToolEnableNavigation,
  12.      'xscale': ToolXScale,
  13.      'yscale': ToolYScale,
  14.      'position': ToolCursorPosition,
  15.      _views_positions: ToolViewsPositions,
  16.      'cursor': 'ToolSetCursor',
  17.      'rubberband': 'ToolRubberband',
  18.      'help': 'ToolHelp',
  19.      'copy': 'ToolCopyToClipboard',
  20.      }
复制代码
验证
  1. import matplotlib.pyplot as plt
  2. import matplotlib as mpl
  3. from pprint import pprint
  4. plt.rcParams['toolbar'] = 'toolmanager'
  5. fig = plt.gcf()
  6. pprint(mpl.backend_tools.default_tools)
复制代码
输出
  1. {'allnav': <class 'matplotlib.backend_tools._ToolEnableAllNavigation'>,
  2.  'back': <class 'matplotlib.backend_tools.ToolBack'>,
  3.  'copy': 'ToolCopyToClipboard',
  4.  'cursor': 'ToolSetCursor',
  5.  'forward': <class 'matplotlib.backend_tools.ToolForward'>,
  6.  'fullscreen': <class 'matplotlib.backend_tools.ToolFullScreen'>,
  7.  'grid': <class 'matplotlib.backend_tools.ToolGrid'>,
  8.  'grid_minor': <class 'matplotlib.backend_tools.ToolMinorGrid'>,
  9.  'help': 'ToolHelp',
  10.  'home': <class 'matplotlib.backend_tools.ToolHome'>,
  11.  'nav': <class 'matplotlib.backend_tools._ToolEnableNavigation'>,
  12.  'pan': <class 'matplotlib.backend_tools.ToolPan'>,
  13.  'position': <class 'matplotlib.backend_tools.ToolCursorPosition'>,
  14.  'quit': <class 'matplotlib.backend_tools.ToolQuit'>,
  15.  'quit_all': <class 'matplotlib.backend_tools.ToolQuitAll'>,
  16.  'rubberband': 'ToolRubberband',
  17.  'save': 'ToolSaveFigure',
  18.  'subplots': 'ToolConfigureSubplots',
  19.  'viewpos': <class 'matplotlib.backend_tools.ToolViewsPositions'>,
  20.  'xscale': <class 'matplotlib.backend_tools.ToolXScale'>,
  21.  'yscale': <class 'matplotlib.backend_tools.ToolYScale'>,
  22.  'zoom': <class 'matplotlib.backend_tools.ToolZoom'>}
复制代码
使用工具栏管理器管理内置工具项
由源码可知默认工具栏模式
  1. toolbar2
复制代码
模式没有提供添加、删除工具项的接口。因此,管理工具栏必要使用工具栏管理器模式
  1. toolmanager
复制代码
,与该模式相干的紧张界说有:
      
    1. matplotlib.backend_bases.ToolContainerBase(toolmanager)
    复制代码
    类:工具栏容器的基类,界说了工具栏编辑的方法。构造函数参数为
    1. toolmanager
    复制代码
    ,表现工具栏容器容纳的工具栏。  
    1. matplotlib.backend_managers.ToolManager(figure=None)
    复制代码
    类:管理用户触发工具栏工具项按钮而产生的动作。
    1. matplotlib.backend_tools.ToolBase
    复制代码
    类:全部工具栏工具项的基类,全部工具项均由
    1. matplotlib.backend_managers.ToolManager
    复制代码
    实例化。  
    1. matplotlib.backend_tools.default_tools
    复制代码
    变量:字典类型,实例化基于
    1. matplotlib.backend_tools.ToolBase
    复制代码
    类界说的内置工具项。  
    1. matplotlib.backend_tools.default_toolbar_tools
    复制代码
    变量:嵌套列表,以类似格式
    1. [[分组1, [工具1, 工具2 ...]], [分组2, [...]]]
    复制代码
    界说工具栏结构。  
    1. matplotlib.backend_tools.add_tools_to_container
    复制代码
    函数:设置
    1. toolbarmanager
    复制代码
    模式默认工具栏。
使用体系函数实现添加工具项

根据源码可知,
  1. matplotlib.backend_tools.add_tools_to_container
复制代码
函数可以设置
  1. toolbarmanager
复制代码
模式默认工具栏。
案例
案例阐明:为工具栏添加
  1. 全屏切换
复制代码
工具项。
  1. import matplotlib.pyplot as plt
  2. import matplotlib as mpl
  3. plt.rcParams['toolbar'] = 'toolmanager'
  4. fig = plt.gcf()
  5. # 通过mpl.backend_tools.add_tools_to_container函数添加工具项
  6. mpl.backend_tools.add_tools_to_container(fig.canvas.manager.toolbar, tools=[['foo', [ 'fullscreen']]])
  7. plt.show()
复制代码
案例剖析:
  1. add_tools_to_container
复制代码
函数有两个参数
  1. container
复制代码
  1. tools
复制代码
,由源码可知
  1. container
复制代码
参数的值应为
  1. fig.canvas.manager.toolbar
复制代码
  1. tools
复制代码
参数按照
  1. [[分组1, [工具1, 工具2 ...]], [分组2, [...]]]
复制代码
格式取值。

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

根据源码可知:
添加内置工具项有两种方法
      
    1. toolbar
    复制代码
    对象可以通过
    1. add_tool
    复制代码
    方法添加内置工具项,参数为
    1. name
    复制代码
    1. tool
    复制代码
    1. name
    复制代码
    为工具项的名称,
    1. tool
    复制代码
    为添加的工具项对应的类大概字符串。  
    1. toolbar
    复制代码
    对象可以通过
    1. add_toolitem
    复制代码
    方法添加内置工具项,参数为
    1. name
    复制代码
    1. group
    复制代码
    1. position
    复制代码
    1. image_file
    复制代码
    1. description
    复制代码
    1. toggle
    复制代码
    1. name
    复制代码
    为工具项的名称,
    1. group
    复制代码
    为工具项地点组,
    1. position
    复制代码
    为工具项在组中的位置,取值为列表索引,一样平常取
    1. -1
    复制代码
    即在地点组末了追加,设置为
    1. 0
    复制代码
    即在地点组的首位,
    1. image_file
    复制代码
    为工具项图像,值为字符串,
    1. description
    复制代码
    为工具项形貌,
    1. toggle
    复制代码
    为是否为切换式工具项,布尔值。  
  • 删除内置工具项有两种方法  
    1. toolbar
    复制代码
    对象可以通过
    1. remove_toolitem
    复制代码
    方法删除内置工具项,参数为
    1. name
    复制代码
    ,即工具项的名称。  
    1. toolmanager
    复制代码
    对象可以通过
    1. remove_tool
    复制代码
    方法删除内置工具项,参数为
    1. name
    复制代码
    ,即工具项的名称。
案例

案例阐明:删除
  1. 向前
复制代码
工具项,添加
  1. 全屏切换
复制代码
工具项。
  1. import matplotlib.pyplot as plt
  2. import matplotlib as mpl
  3. plt.rcParams['toolbar'] = 'toolmanager'
  4. fig = plt.gcf()
  5. fig.canvas.manager.toolmanager.remove_tool('forward')
  6. fig.canvas.manager.toolbar.remove_toolitem('back')
  7. fig.canvas.manager.toolbar.add_tool('quit', 'foo')
  8. fig.canvas.manager.toolbar.add_toolitem('fullscreen', 'foo', -1,'fullscreen','fullscreen',False)
  9. plt.show()
复制代码

总结

通过工具栏管理器添加、删除内置工具项的方法许多种,必要留意调用对象、方法、参数,阅读下面的
  1. matplotlib
复制代码
源码大概会有所启发。
相干源码
  1. matplotlib.backends.backend_qt5
复制代码
模块
  1. class FigureManagerQT(FigureManagerBase):
  2. self.toolbar = self._get_toolbar(self.canvas, self.window)
  3. if self.toolmanager:
  4.   backend_tools.add_tools_to_manager(self.toolmanager)
  5.   if self.toolbar:
  6.    backend_tools.add_tools_to_container(self.toolbar)
  7. if self.toolbar:
  8.   self.window.addToolBar(self.toolbar)
  9.   tbs_height = self.toolbar.sizeHint().height()
  10. else:
  11.   tbs_height = 0
复制代码
  1. def _get_toolbar(self, canvas, parent):
  2.   # must be inited after the window, drawingArea and figure
  3.   # attrs are set
  4.   if matplotlib.rcParams['toolbar'] == 'toolbar2':
  5.    toolbar = NavigationToolbar2QT(canvas, parent, True)
  6.   elif matplotlib.rcParams['toolbar'] == 'toolmanager':
  7.    toolbar = ToolbarQt(self.toolmanager, self.window)
  8.   else:
  9.    toolbar = None
  10.   return toolbar
复制代码
  1. class ToolbarQt(ToolContainerBase, QtWidgets.QToolBar):
  2. def __init__(self, toolmanager, parent):
  3.   ToolContainerBase.__init__(self, toolmanager)
  4.   QtWidgets.QToolBar.__init__(self, parent)
  5.   self.setAllowedAreas(
  6.    QtCore.Qt.TopToolBarArea | QtCore.Qt.BottomToolBarArea)
  7.   message_label = QtWidgets.QLabel("")
  8.   message_label.setAlignment(
  9.    QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
  10.   message_label.setSizePolicy(
  11.    QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding,
  12.          QtWidgets.QSizePolicy.Ignored))
  13.   self._message_action = self.addWidget(message_label)
  14.   self._toolitems = {}
  15.   self._groups = {}
  16. def add_toolitem(
  17.    self, name, group, position, image_file, description, toggle):
  18.   button = QtWidgets.QToolButton(self)
  19.   if image_file:
  20.    button.setIcon(NavigationToolbar2QT._icon(self, image_file))
  21.   button.setText(name)
  22.   if description:
  23.    button.setToolTip(description)
  24.   def handler():
  25.    self.trigger_tool(name)
  26.   if toggle:
  27.    button.setCheckable(True)
  28.    button.toggled.connect(handler)
  29.   else:
  30.    button.clicked.connect(handler)
  31.   self._toolitems.setdefault(name, [])
  32.   self._add_to_group(group, name, button, position)
  33.   self._toolitems[name].append((button, handler))
  34. def _add_to_group(self, group, name, button, position):
  35.   gr = self._groups.get(group, [])
  36.   if not gr:
  37.    sep = self.insertSeparator(self._message_action)
  38.    gr.append(sep)
  39.   before = gr[position]
  40.   widget = self.insertWidget(before, button)
  41.   gr.insert(position, widget)
  42.   self._groups[group] = gr
  43. def toggle_toolitem(self, name, toggled):
  44.   if name not in self._toolitems:
  45.    return
  46.   for button, handler in self._toolitems[name]:
  47.    button.toggled.disconnect(handler)
  48.    button.setChecked(toggled)
  49.    button.toggled.connect(handler)
  50. def remove_toolitem(self, name):
  51.   for button, handler in self._toolitems[name]:
  52.    button.setParent(None)
  53.   del self._toolitems[name]
  54. def set_message(self, s):
  55.   self.widgetForAction(self._message_action).setText(s
复制代码
  1. matplotlib.backend_tools
复制代码
模块
  1. def add_tools_to_container(container, tools=default_toolbar_tools):
  2. """
  3. Add multiple tools to the container.
  4. Parameters
  5. ----------
  6. container : Container
  7.   `backend_bases.ToolContainerBase` object that will get the tools added.
  8. tools : list, optional
  9.   List in the form ``[[group1, [tool1, tool2 ...]], [group2, [...]]]``
  10.   where the tools ``[tool1, tool2, ...]`` will display in group1.
  11.   See `add_tool` for details.
  12. """
  13. for group, grouptools in tools:
  14.   for position, tool in enumerate(grouptools):
  15.    container.add_tool(tool, group, position)
复制代码
  1. def add_tools_to_manager(toolmanager, tools=default_tools):
  2. """
  3. Add multiple tools to a `.ToolManager`.
  4. Parameters
  5. ----------
  6. toolmanager : `.backend_managers.ToolManager`
  7.   Manager to which the tools are added.
  8. tools : {str: class_like}, optional
  9.   The tools to add in a {name: tool} dict, see `add_tool` for more
  10.   info.
  11. """
  12. for name, tool in tools.items():
  13.   toolmanager.add_tool(name, tool)
复制代码
到此这篇关于python matplotlib工具栏源码探析二之添加、删除内置工具项的案例的文章就先容到这了,更多相干python matplotlib内置工具项内容请搜刮草根技术分享以前的文章或继承欣赏下面的相干文章希望各人以后多多支持草根技术分享!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作