MEP23:每个 GUI 窗口多个图形#

状态#

讨论

分支和 Pull requests#

之前的工作 - matplotlib/matplotlib#2465 要删除

摘要#

添加将多个图形分组在同一个 FigureManager 下的可能性

详细描述#

在当前结构下,每个画布都有自己的窗口.

这现在并且可能继续是大多数用例所需的运行方法.

有时,当同时打开太多图形时,希望能够将这些图形分组在同一个窗口下.请参阅 PR #2194 .

建议的解决方案修改了 FigureManagerBase 以包含和管理多个 Canvas . backend.multifigure rcParam 控制何时需要 MultiFigure 行为.

Note

重要的是要注意,所提出的解决方案假定 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 ,因为 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 的情况.这将保证自定义后端不会出现任何问题,但也会使代码更大,并且需要维护更多内容.