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


Posted in Python onFebruary 25, 2021

使用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>)]}

到此这篇关于pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异的文章就介绍到这了,更多相关pytho matplotlib工具栏内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python中的实例方法、静态方法、类方法、类变量和实例变量浅析
Apr 26 Python
Python中操作MySQL入门实例
Feb 08 Python
Python爬虫实现全国失信被执行人名单查询功能示例
May 03 Python
python实现蒙特卡罗方法教程
Jan 28 Python
Pycharm如何打断点的方法步骤
Jun 13 Python
Django使用 Bootstrap 样式修改书籍列表过程解析
Aug 09 Python
python3 selenium自动化 下拉框定位的例子
Aug 23 Python
python读取csv文件指定行的2种方法详解
Feb 13 Python
Python 私有属性和私有方法应用场景分析
Jun 19 Python
Pytorch mask-rcnn 实现细节分享
Jun 24 Python
如何在mac下配置python虚拟环境
Jul 06 Python
用60行代码实现Python自动抢微信红包
Feb 04 Python
使用tkinter实现三子棋游戏
Feb 25 #Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
Feb 25 #Python
python matplotlib工具栏源码探析三之添加、删除自定义工具项的案例详解
Feb 25 #Python
python实现简单文件读写函数
Feb 25 #Python
python pygame 愤怒的小鸟游戏示例代码
Feb 25 #Python
python网络爬虫实现发送短信验证码的方法
Feb 25 #Python
python openpyxl模块的使用详解
Feb 25 #Python
You might like
php的一个登录的类 [推荐]
2007/03/16 PHP
关于php连接mssql:pdo odbc sql server
2011/07/20 PHP
PDO防注入原理分析以及使用PDO的注意事项总结
2014/10/23 PHP
变量在 PHP7 内部的实现(一)
2015/12/21 PHP
PHP查询大量数据内存耗尽问题的解决方法
2016/10/28 PHP
YUI 读码日记之 YAHOO.lang.is*
2008/03/22 Javascript
用js实现table单元格高宽调整,兼容合并单元格(兼容IE6、7、8、FF)实例
2013/06/25 Javascript
文件编码导致jquery失效的解决方法
2013/06/26 Javascript
JS关闭窗口与JS关闭页面的几种方法小结
2013/12/17 Javascript
JQuery中Text方法用法实例分析
2015/05/18 Javascript
jQuery无刷新上传之uploadify3.1简单使用
2016/06/18 Javascript
JavaScript实现简单的日历效果
2016/09/25 Javascript
Vue.js实现实例搜索应用功能详细代码
2017/08/24 Javascript
jQuery进阶实践之利用最优雅的方式如何写ajax请求
2017/12/20 jQuery
AngularJS实现的根据数量与单价计算总价功能示例
2017/12/26 Javascript
Javasript设计模式之链式调用详解
2018/04/26 Javascript
Nuxt配合Node在实际生产中的应用详解
2018/08/07 Javascript
ZK中使用JS读取客户端txt文件内容问题
2019/11/07 Javascript
解决vue scoped scss 无效的问题
2020/09/04 Javascript
关于vue的列表图片选中打钩操作
2020/09/09 Javascript
[02:12]Dota 2 推出全新英雄—— 电炎绝手
2019/08/23 DOTA
Python实现telnet服务器的方法
2015/07/10 Python
对python 调用类属性的方法详解
2019/07/02 Python
Django中celery执行任务结果的保存方法
2019/07/12 Python
原生python实现knn分类算法
2019/10/24 Python
python可视化text()函数使用详解
2020/02/11 Python
基于PyQT实现区分左键双击和单击
2020/05/19 Python
html5给汉字加拼音加进度条的实现代码
2020/04/07 HTML / CSS
严选全球尖货,立足香港:Bonpont宝盆
2018/07/24 全球购物
M.M.LaFleur官网:美国职业女装品牌
2020/10/27 全球购物
shallow copy和deep copy的区别
2016/05/09 面试题
车间调度岗位职责
2013/11/30 职场文书
银行求职信范文怎么写
2015/03/20 职场文书
2015年小学中秋节活动总结
2015/03/23 职场文书
教师节主题班会教案
2015/08/17 职场文书
Python尝试实现蒙特卡罗模拟期权定价
2022/04/21 Python