MEP22:工具栏重写#
状态#
进步
分支和拉取请求#
之前的工作:
拉取请求:
删除 NavigationToolbar 类 https://github.com/matplotlib/matplotlib/pull/2740已 关闭
保持 NavigationToolbar 类https://github.com/matplotlib/matplotlib/pull/2759 关闭
摘要#
此 MEP 的主要目标是使用户与图形交互的方式更容易修改(添加、更改、删除)。
用户与图形的交互深度集成在画布和工具栏中。使进行任何修改变得极其困难。
本 MEP 建议将此交互分离为工具栏、导航和工具,以提供独立的访问和重新配置。
这种方法将更容易在用户之间创建和共享工具。在遥远的未来,我们甚至可以预见一种市场,Tool
其中最受欢迎的可以添加到主要分布中。
详细说明#
Toolbar 的重新配置很复杂,大多数情况下它需要自定义后端。
自定义工具的创建有时会干扰工具栏,例如参见https://github.com/matplotlib/matplotlib/issues/2694快捷方式也是硬编码的,并且不容易修改 https://github.com/matplotlib/matplotlib /问题/2699
建议的解决方案是Toolbar
从Canvas
. 动作和快捷方式将采用Tool
s 的形式。
一个新的类Navigation
将成为来自
Canvas
and的事件之间的桥梁Toolbar
,并将它们重定向到适当的Tool
.
最后,用户交互将分为三类:
NavigationBase:为每个 FigureManager 实例化此类,并将所有用户交互与工具连接起来
ToolbarBase:这个现有的类仅被降级为对工具的 GUI 访问。
ToolBase:是Tools的基本定义。
实施#
工具库(对象)#
工具可以具有图形表示形式,SubplotTool
也可以不存在于工具栏中Quit
。
ToolBase
具有以下用于在定义时进行配置的类属性
keymap = None:用于触发工具的键
description = '':工具的小描述
image = None:工具栏中使用的图像
以下实例属性在实例化时设置:
姓名
导航
方法#
trigger(self, event)
: 这是 Tool 的主要方法,当 Tool 被触发时调用:工具栏按钮单击
与工具键盘映射关联的按键
调用 navigation.trigger_tool(name)
set_figure(self, figure)
:设置图形和导航属性destroy(self, *args)
:销毁Tool
图形界面(如果存在)
可用工具#
工具退出
ToolEnableAllNavigation
工具启用导航
工具切换网格
工具切换全屏
ToolToggleYScale
ToolToggleXScale
工具之家
工具返回
工具转发
保存图基
配置子图基
ToolToggleBase(ToolBase) #
ToolToggleBase
具有以下用于在定义时进行配置的类属性
radio_group = None:用于对类似工具的“收音机”进行分组的属性(互斥)
cursor = None:工具激活时使用的光标
Toggleable Tools,可以捕获按键、鼠标移动和鼠标按钮按下
方法#
enable(self, event)
:ToolToggleBase.trigger
方法调用disable(self, event)
:当工具未切换时调用toggled
:属性True 或 False
可用工具#
工具缩放
工具盘
工具栏库#
方法(用于后端实现)#
add_toolitem(self, name, group, position, image, description, toggle)
:将工具项添加到工具栏。此方法是来自tool_added_event
(由导航发出)的回调set_message(self, s)
:在工具栏或状态栏中显示消息toggle_toolitem(self, name)
:在不触发事件的情况下切换工具项。remove_toolitem(self, name)
:从Toolbar
向后兼容性#
为了向后兼容,在rcParams["toolbar"]
(默认值:)支持的值列表中添加了“导航” 'toolbar2'
,用于Navigation
类实例化而不是 NavigationToolbar 类
使用此参数,它对使用现有后端的任何人都是透明的。
[@pelson 评论:这也让我们有机会避免需要在同一个 PR 中实现所有这些——一些后端可能会在短时间内没有新功能而存在(但必须在某个时候完成)。]