python matplotlib工具栏源码探析三之添加、删除自定义工具项的案例详解
matplotlib工具栏源码探析二(添加、删除内置工具项)探讨了工具栏内置工具项的管理,除了内置工具项,很多场景中需要自定义工具项,官方给出了案例https://matplotlib.org/gallery/user_interfaces/toolmanager_sgskip.html,主要基于matplotlib.backend_managers.ToolManager类实现,即使用工具栏管理器模式。
官方案例解析
下面对官方案例关键点做注释说明。
importmatplotlib.pyplotasplt
#设置工具栏使用工具栏管理器模式
plt.rcParams['toolbar']='toolmanager'
#导入工具项的基类ToolBase和ToolToggleBase
frommatplotlib.backend_toolsimportToolBase,ToolToggleBase
#因为工具项必须以类的形式添加,所以创建自定义基本工具项类,基类为ToolBase
classListTools(ToolBase):
#该工具项的功能为列出工具栏管理器管理的所有工具项
"""Listallthetoolscontrolledbythe`ToolManager`."""
#设置默认快捷键和工具项描述
default_keymap='m'
description='ListTools'
#定义工具项被触发时的动作
deftrigger(self,*args,**kwargs):
print('_'*80)
print("{0:12}{1:45}{2}".format(
'Name(id)','Tooldescription','Keymap'))
print('-'*80)
#获取工具栏管理器管理的所有工具项
tools=self.toolmanager.tools
#输出各个工具项
fornameinsorted(tools):
ifnottools[name].description:
continue
keys=','.join(sorted(self.toolmanager.get_tool_keymap(name)))
print("{0:12}{1:45}{2}".format(
name,tools[name].description,keys))
print('_'*80)
print("ActiveToggletools")
print("{0:12}{1:45}".format("Group","Active"))
print('-'*80)
forgroup,activeinself.toolmanager.active_toggle.items():
print("{0:12}{1:45}".format(str(group),str(active)))
#基于ToolToggleBase创建自定义切换式工具项,切换式工具项在触发时会在生效和失效两种状态之间切换
classGroupHideTool(ToolToggleBase):
#该工具项的功能为根据分组切换显示/隐藏数据元素
"""Showlineswithagivengid."""
#设置默认快捷键和工具项描述
default_keymap='G'
description='Showbygid'
default_toggled=True
#构造函数的参数gid为数据元素的分组
def__init__(self,*args,gid,**kwargs):
self.gid=gid
super().__init__(*args,**kwargs)
#定义工具项生效时的方法
defenable(self,*args):
self.set_lines_visibility(True)
#定义工具项失效时的方法
defdisable(self,*args):
self.set_lines_visibility(False)
defset_lines_visibility(self,state):
foraxinself.figure.get_axes():
forlineinax.get_lines():
ifline.get_gid()==self.gid:
line.set_visible(state)
#注意!在图像生成之后,修改图像中的元素必须重绘
self.figure.canvas.draw()
fig=plt.figure()
#注意通过gid属性可以为数据元素分组
plt.plot([1,2,3],gid='mygroup')
plt.plot([2,3,4],gid='unknown')
plt.plot([3,2,1],gid='mygroup')
#将自定义的工具项添加添加到工具栏管理器,格式为工具项名称工具项类其他参数
fig.canvas.manager.toolmanager.add_tool('List',ListTools)
fig.canvas.manager.toolmanager.add_tool('Show',GroupHideTool,gid='mygroup')
#可以反复添加已存在的工具项
#Addanexistingtooltonewgroup`foo`.
#Itcanbeaddedasmanytimesaswewant
fig.canvas.manager.toolbar.add_tool('zoom','foo')
#删除工具项
#Removetheforwardbutton
fig.canvas.manager.toolmanager.remove_tool('forward')
#新添加到工具栏管理器的工具项还不能直接使用,需要通过toolbar对象添加到当前工具栏
#如果不将自定义的工具项添加到工具栏管理器,直接使用toolbar对象添加则会报错
#将自定义的工具项Show添加到内置的navigation组的特定位置(即组内第2个位置)
#Toaddacustomtooltothetoolbaratspecificlocationinside
#thenavigationgroup
fig.canvas.manager.toolbar.add_tool('Show','navigation',1)
#fig.canvas.manager.toolbar.add_tool('List','navigation',2)
plt.show()
官方案例运行结果
运行后自定义的Show按钮处于生效状态,3条线全部显示。
点击Show按钮,使之处理失效状态,mygroup组的两条线不再显示。
由于案例中仅将List工具项添加到工具栏管理器,但是没有添加到工具栏中,因此List工具项未在工具栏中显示。但是List工具项的快捷键m是生效的,在界面上按快捷键m,控制台输出以下信息。
________________________________________________________________________________
Name(id)TooldescriptionKeymap
--------------------------------------------------------------------------------
ListListToolsm
ShowShowbygidG
allnavEnableallaxestoolmanagera
backBacktopreviousviewMouseButton.BACK,backspace,c,left
copyCopythecanvasfiguretoclipboardcmd+c,ctrl+c
fullscreenTogglefullscreenmodectrl+f,f
gridTogglemajorgridsg
grid_minorTogglemajorandminorgrids
helpPrinttoollist,shortcutsanddescriptionf1
homeResetoriginalviewh,home,r
navEnableoneaxestoolmanager1,2,3,4,5,6,7,8,9
panPanaxeswithleftmouse,zoomwithrightp
quitQuitthefigurecmd+w,ctrl+w,q
quit_allQuitallfigures
saveSavethefigurectrl+s,s
subplotsConfiguresubplots
xscaleTogglescaleXaxisL,k
yscaleTogglescaleYaxisl
zoomZoomtorectangleo
________________________________________________________________________________
ActiveToggletools
GroupActive
--------------------------------------------------------------------------------
defaultNone
None{'Show'}
总结
matplotlib支持两种工具项:基本工具项(基类ToolBase)和切换式工具项(基类ToolToggleBase)。
基本工具项需要注意定义trigger方法,即工具项被触发时的动作。
切换式工具项需要注意定义enable和disable方法,即生效和失效两种状态的动作,如方法定义中牵扯到修改图像,需要注意重绘图像。
注意添加自定义工具项的流程!先将自定义的工具项添加到工具栏管理器,然后再添加到当前工具栏!内置工具项之所以不用添加到工具栏管理器是因为它们本身就已经添加在工具栏管理器!
到此这篇关于matplotlib工具栏源码探析三之添加、删除自定义工具项的文章就介绍到这了,更多相关matplotlib工具栏内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。