pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异

作者:mighty13 时间:2021-08-31 05:15:21 

使用matplotlib绘图时,在弹出的窗口中默认是有工具栏的,那么这些工具栏是如何定义的呢?

工具栏的三种模式

matplotlib的基础配置由运行时参数(rcParams)控制,导入matplotlib时,加载matplotlibrc文件生成默认运行时参数。
查看matplotlibrc文件可知#toolbar: toolbar2 # {None, toolbar2, toolmanager},即工具栏有三种模式Nonetoolbar2toolmanager,其中默认模式为toolbar2

工具栏模式切换

通过类似语句plt.rcParams['toolbar'] = 'None'可控制工具栏的模式。
需要注意的是plt.rcParams['toolbar'] = 'None'应当放置在图像实例化之前。

None模式:禁用工具栏。
plt.rcParams['toolbar'] = 'None'

pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异

toolbar2模式:默认工具栏布局。
plt.rcParams['toolbar'] = 'toolbar2'

pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异

toolmanager模式:工具栏布局模式与toolbar2模式稍有不同。
plt.rcParams['toolbar'] = 'toolmanager'

pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异

工具栏模式切换原理

和工具栏相关的模块有:

  • matplotlib.backend_bases

  • matplotlib.backend_managers

  • matplotlib.backend_tools

  • matplotlib.backends

工具栏最终依靠后端实现,不同的后端具体实现会有一些差异,我选择的后端是Pyqt5,通过查看模块matplotlib.backends.backend_qt5源码可知,matplotlib在利用后端生成窗口时根据rcParams['toolbar']的值选择不同的工具栏构造方式。


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

默认模式(toolbar2)原理

与该模式相关的重要定义有:

  • matplotlib.backend_bases.NavigationToolbar2(canvas)类:默认的toolbar2模式工具栏的基类,后端需要通过canvas对象处理工具栏按钮事件、覆盖构造方法初始化工具栏、覆盖save_figure()等方法。

  • matplotlib.backends.backend_qt5.NavigationToolbar2QT(NavigationToolbar2, QtWidgets.QToolBar)类:定义了QT后端默认模式工具栏的具体实现。

  • matplotlib.backend_bases.FigureCanvasBase类:canvas对象的基类,通过toolbar属性与工具栏进行连接。

  • matplotlib.backend_bases.NavigationToolbar2(canvas).toolitems属性:定义了默认模式工具栏工具项列表。

案例:验证默认模式工具栏布局


import matplotlib.pyplot as plt

fig=plt.gcf()
toolbar = fig.canvas.manager.toolbar
print(toolbar.toolitems)

输出:

[('Home', 'Reset original view', 'home', 'home'),
 ('Back', 'Back to previous view', 'back', 'back'),
 ('Forward', 'Forward to next view', 'forward', 'forward'),
 (None, None, None, None),
 ('Pan', 'Left button pans, Right button zooms\nx/y fixes axis, CTRL fixes aspect', 'move', 'pan'),
 ('Zoom', 'Zoom to rectangle\nx/y fixes axis, CTRL fixes aspect', 'zoom_to_rect', 'zoom'),
 ('Subplots', 'Configure subplots', 'subplots', 'configure_subplots'),
 ('Customize', 'Edit axis, curve and image parameters', 'qt4_editor_options', 'edit_parameters'),
 (None, None, None, None),
 ('Save', 'Save the figure', 'filesave', 'save_figure')]

根据源码可知,列表中每个元组为工具项定义,元组的四个元素分别表示按钮名称、按钮提示文本、按钮图像、按钮对应方法。


# list of toolitems to add to the toolbar, format is:
# (
#  text, # the text of the button (often not visible to users)
#  tooltip_text, # the tooltip shown on hover (where possible)
#  image_file, # name of the image for the button (without the extension)
#  name_of_method, # name of the method in NavigationToolbar2 to call
# )

工具栏管理器模式(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模式默认工具栏。

案例:验证工具栏管理器模式工具栏布局


import matplotlib.pyplot as plt

plt.rcParams['toolbar'] = 'toolmanager'
fig=plt.gcf()
toolbar= fig.canvas.manager.toolbar
print(toolbar._toolitems)

输出:

{'home': [(<PyQt5.QtWidgets.QToolButton object at 0x00000289EABBC1F8>, <function ToolbarQt.add_toolitem.<locals>.handler at 0x00000289EB0BC510>)],
 'back': [(<PyQt5.QtWidgets.QToolButton object at 0x00000289EAE86678>, <function ToolbarQt.add_toolitem.<locals>.handler at 0x00000289EB0BC598>)],
 'forward': [(<PyQt5.QtWidgets.QToolButton object at 0x00000289EAE8B4C8>, <function ToolbarQt.add_toolitem.<locals>.handler at 0x00000289EB0BC620>)],
 'pan': [(<PyQt5.QtWidgets.QToolButton object at 0x00000289EAE8BAF8>, <function ToolbarQt.add_toolitem.<locals>.handler at 0x00000289EB0BC6A8>)],
 'zoom': [(<PyQt5.QtWidgets.QToolButton object at 0x00000289EAE93DC8>, <function ToolbarQt.add_toolitem.<locals>.handler at 0x00000289EB0BC7B8>)],
 'subplots': [(<PyQt5.QtWidgets.QToolButton object at 0x00000289EAE93438>, <function ToolbarQt.add_toolitem.<locals>.handler at 0x00000289EB0BC8C8>)],
 'save': [(<PyQt5.QtWidgets.QToolButton object at 0x00000289EAE93678>, <function ToolbarQt.add_toolitem.<locals>.handler at 0x00000289EB0BC950>)],
 'help': [(<PyQt5.QtWidgets.QToolButton object at 0x00000289EAE93A68>, <function ToolbarQt.add_toolitem.<locals>.handler at 0x00000289EB0BC9D8>)]}

来源:https://blog.csdn.net/mighty13/article/details/112540444

标签:pytho,matplotlib,工具栏
0
投稿

猜你喜欢

  • Python设计模式之抽象工厂模式原理与用法详解

    2023-01-25 16:05:43
  • Python模块_PyLibTiff读取tif文件的实例

    2023-04-11 03:22:06
  • 九个Python列表生成式高频面试题汇总

    2023-06-04 20:09:51
  • Oracle数据库按时间进行分组统计数据的方法

    2023-07-14 13:52:56
  • SQL Server把某个字段的数据用一条语句转换成字符串

    2024-01-13 16:10:12
  • python如何正确的操作字符串

    2023-12-28 02:46:30
  • golang goquery selector选择器使用示例大全

    2023-10-14 15:40:58
  • php广告加载类用法实例

    2023-11-14 14:56:53
  • RedHat 9.0下用rpm包安装mysql

    2008-11-22 12:28:00
  • Python通过TensorFLow进行线性模型训练原理与实现方法详解

    2022-11-10 16:17:27
  • JavaScript 判断日期格式是否正确的实现代码

    2011-07-05 12:37:44
  • Javascript Closures (1)

    2009-03-18 12:14:00
  • IE7兼容模式与兼容视图

    2010-06-28 18:48:00
  • 关于Django显示时间你应该知道的一些问题

    2023-10-23 06:26:21
  • Python MySQLdb 使用utf-8 编码插入中文数据问题

    2023-07-31 11:04:13
  • python读取txt文件并取其某一列数据的示例

    2022-09-25 01:58:09
  • ASP:一个网站空间多个域名访问

    2008-11-21 17:03:00
  • JavaScript实现鼠标经过显示下拉框

    2024-04-28 09:52:36
  • 404错误伪静态类封装class RewriteBase

    2009-06-29 16:19:00
  • CSS清除浮动常用方法小结

    2009-07-07 11:59:00
  • asp之家 网络编程 m.aspxhome.com