MEP22:工具栏重写¶
分支和请求¶
- 前期工作
- 拉动请求:
- 删除导航工具栏类https://github.com/matplotlib/matplotlib/pull/2740 CLOSED
- 保留导航工具栏类https://github.com/matplotlib/matplotlib/pull/2759 CLOSED
- 按事件导航:https://github.com/matplotlib/matplotlib/pull/3652
摘要¶
该MEP的主要目标是使用户与图形交互的方式更容易修改(添加、更改、删除)。
用户与图形的交互在画布和工具栏中被深度集成。使得任何修改都非常困难。
此MEP建议将此交互分离到工具栏、导航和工具中,以提供独立的访问和重新配置。
这种方法将更容易在用户之间创建和共享工具。在遥远的将来,我们甚至可以预见到 Tools
其中最流行的可以添加到主发行版中。
详细描述¶
工具栏的重新配置很复杂,大多数时候它需要一个自定义的后端。
自定义工具的创建有时会干扰工具栏,例如,请参阅https://github.com/matplotlib/matplotlib/issues/2694。此外,快捷方式是硬编码的,而且不容易修改https://github.com/matplotlib/matplotlib/issues/2699。
建议的解决方案是 Toolbar
以及 Canvas
. 此操作和快捷方式的形式为 Tools
.
一个新班级 Navigation
将是事件之间的桥梁 Canvas
和 Toolbar
并将它们重定向到适当的 Tool
.
最后,用户交互将分为三类:
- NavigationBase:这个类是为每个FigureManager实例化的,并将所有用户交互与工具连接起来。
- toolbarbase:这个现有的类只作为对工具的GUI访问降级。
- 工具库:是工具的基本定义。
实施¶
工具库(对象)¶
工具可以有一个图形表示,作为 SubplotTool
甚至不存在于工具栏中 Quit
这个 ToolBase
在定义时具有以下用于配置的类属性
- keymap=none:用于触发工具的键
- description=':工具的小描述
- image=none:工具栏中使用的图像
- 以下实例属性在实例化时设置:
- 名称
- 航行
- Methods
- 触发器(self,event):这是工具的主要方法,当工具被以下触发时调用: 工具栏按钮单击 与工具keymap*关联的按键调用navigation.trigger_tool(name)
- 设置图形(self,figure):设置图形和导航属性
destroy(self, *args)
摧毁Tool
图形界面(如果存在)
- 可用工具
- ToolQuit
- ToolEnableAllNavigation
- ToolEnableNavigation
- ToolToggleGrid
- ToolToggleFullScreen
- ToolToggleYScale
- ToolToggleXScale
- ToolHome
- ToolBack
- ToolForward
- SaveFigureBase
- ConfigureSubplotsBase
toolToggleBase(工具库)¶
这个 ToolToggleBase
在定义时具有以下用于配置的类属性
- radio_group=none:组“radio”类工具的属性(互斥)
- 光标=无:当工具处于活动状态时要使用的光标
这个 可切换的 工具,可以捕获按键、鼠标移动和鼠标按钮按下
- 它定义了以下方法
- 启用(self,event):由调用
ToolToggleBase.trigger
方法 - 禁用(self,event):在工具未切换时调用
- 切换: 财产 真与假
- 启用(self,event):由调用
- 可用工具
- ToolZoom
- ToolPan
ToolbarBase¶
- 方法 后端实现
- 添加工具项(self、name、group、position、image、description、toggle):将工具项添加到工具栏。此方法是来自的回调
tool_added_event
(导航发射) - 设置消息(self,s):在工具栏或状态栏中显示消息
- 切换工具项(self,name):在不触发事件的情况下切换工具项。
- 移除工具项(self,name):从
Toolbar
- 添加工具项(self、name、group、position、image、description、toggle):将工具项添加到工具栏。此方法是来自的回调
向后兼容性¶
为了向后兼容,在支持的值列表中添加了“导航” rcParams["toolbar"]
(default: 'toolbar2'
) ,用于导航类实例化,而不是导航工具栏类
使用此参数,它可以使使用现有后端的任何人都透明。
[@pelson comment: This also gives us an opportunity to avoid needing to implement all of this in the same PR - some backends can potentially exist without the new functionality for a short while (but it must be done at some point).]