由源码可知,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':
,
'back':,
'copy': 'ToolCopyToClipboard',
'cursor': 'ToolSetCursor',
'forward':,
'fullscreen':,
'grid':,
'grid_minor':,
'help': 'ToolHelp',
'home':,
'nav':,
'pan':,
'position':,
'quit':,
'quit_all':,
'rubberband': 'ToolRubberband',
'save': 'ToolSaveFigure',
'subplots': 'ToolConfigureSubplots',
'viewpos':,
'xscale':,
'yscale':,
'zoom':}
使用工具栏管理器管理内置工具项
由源码可知默认工具栏模式toolbar2
模式没有提供添加、删除工具项的接口。因此,管理工具栏需要使用工具栏管理器模式toolmanager
,与该模式相关的重要定义有:
matplotlib.backend_bases.ToolContainerBase(toolmanager)
类:工具栏容器的基类,定义了工具栏编辑的方法。构造函数参数为toolmanager
,表示工具栏容器容纳的工具栏。matplotlib.backend_managers.ToolManager(figure=None)
类:管理用户触发工具栏工具项按钮而产生的动作。matplotlib.backend_tools.ToolBase
类:所有工具栏工具项的基类,所有工具项均由matplotlib.backend_managers.ToolManager
实例化。matplotlib.backend_tools.default_tools
变量:字典类型,实例化基于matplotlib.backend_tools.ToolBase
类定义的内置工具项。matplotlib.backend_tools.default_toolbar_tools
变量:嵌套列表,以类似格式[[分组1, [工具1, 工具2 ...]], [分组2, [...]]]
定义工具栏布局。matplotlib.backend_tools.add_tools_to_container
函数:设置toolbarmanager
模式默认工具栏。根据源码可知,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()```
<p>案例解析:<code>add_tools_to_container</code>函数有两个参数<code>container</code>和<code>tools</code>,由源码可知<code>container</code>参数的值应为<code>fig.canvas.manager.toolbar</code>,<code>tools</code>参数按照<code>[[分组1, [工具1, 工具2 ...]], [分组2, [...]]]</code>格式取值。</p>
<p style="text-align: center"><img alt="在这里插入图片描述" src="https://img.94e.cn/media/uploads/full/20210327/2021022515120692.png"></p>
<h2>使用工具栏管理器实现添加、删除内置工具项</h2>
<p>根据源码可知:</p>
<p>添加内置工具项有两种方法</p>
<ul>
<li><code>toolbar</code>对象可以通过<code>add_tool</code>方法添加内置工具项,参数为<code>name</code>和<code>tool</code>,<code>name</code>为工具项的名称,<code>tool</code>为添加的工具项对应的类或者字符串。</li>
<li><code>toolbar</code>对象可以通过<code>add_toolitem</code>方法添加内置工具项,参数为<code>name</code>、<code>group</code>、 <code>position</code>、 <code>image_file</code>、 <code>description</code>和 <code>toggle</code>,<code>name</code>为工具项的名称,<code>group</code>为工具项所在组,<code>position</code>为工具项在组中的位置,取值为列表索引,一般取<code>-1</code>即在所在组末尾追加,设置为<code>0</code>即在所在组的首位,<code>image_file</code>为工具项图像,值为字符串,<code>description</code>为工具项描述, <code>toggle</code>为是否为切换式工具项,布尔值。</li>
<li>删除内置工具项有两种方法</li>
<li><code>toolbar</code>对象可以通过<code>remove_toolitem</code>方法删除内置工具项,参数为<code>name</code>,即工具项的名称。</li>
<li><code>toolmanager</code>对象可以通过<code>remove_tool</code>方法删除内置工具项,参数为<code>name</code>,即工具项的名称。</li>
</ul>
<h2>案例</h2>
<p>案例说明:删除<code>向前</code>工具项,添加<code>全屏切换</code>工具项。</p>
```python
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博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持python博客!
标签:matplotlib
Powered By python教程网 鲁ICP备18013710号
python博客 - 小白学python最友好的网站!