MEP23: 每个GUI窗口的多张图#
状态#
讨论
分支和拉取请求#
先前的工作 - matplotlib/matplotlib#2465 待删除
摘要#
增加在同一个 FigureManager 下分组多个图表的可能性
详细描述#
在当前结构下,每个画布都有自己的窗口。
这是并且可能继续成为大多数使用场景下的理想操作方法。
有时当同时打开太多图形时,能够将这些图形分组在同一个窗口下是可取的。参见 PR #2194。
提出的解决方案修改了 FigureManagerBase 以包含和管理多个 Canvas 。设置参数 rcParams["backend.multifigure"] 控制何时需要 MultiFigure 行为。
注意
需要注意的是,所提出的解决方案假设 MEP22 已经实施。这仅仅是因为 Toolbar 的实际实现使得在画布之间切换变得相当困难。
实现#
第一个实现将使用 GTK3 并使用 Notebook 作为画布容器。
FigureManagerBase#
将添加以下新方法
add_canvas: 向现有的FigureManager对象添加画布remove_canvas: 从FigureManager对象中移除一个画布,如果是最后一个,它将被销毁。move_canvas: 将画布从一个FigureManager移动到另一个。set_canvas_title: 用于更改与特定画布容器关联的标题get_canvas_title: 获取与特定画布容器关联的标题get_active_canvas: 获取处于前台并接受gui事件的画布。没有set_active_canvas,因为活动画布是在Canvas对象上调用show时定义的。
new_figure_manager#
为了控制哪个 FigureManager 将包含新图形,将添加一个额外的可选参数 figuremanager,该参数值将传递给 new_figure_manager_given_figure。
new_figure_manager_given_figure#
如果给出了 figuremanager 参数,将使用这个
FigureManager对象,而不是创建一个新的。如果
rcParams['backend.multifigure']为 True:将使用最后一个FigureManager对象,而不是创建一个新的。
向后兼容性#
要使 MultiFigure 属性可见,用户必须直接激活它们,设置 rcParams['backend.multifigure'] = True
即使后端尚未实现 MultiFigure 魔法,只要它们遵循当前的 FigureManagerBase 结构,就应该保持向后兼容。
替代方案#
与其修改 FigureManagerBase,不如添加一个并行的类,处理 rcParams['backend.multifigure'] = True 的情况。这将保证自定义后端不会出现问题,但也会使代码变大,需要维护的内容增多。