MEP23: Múltiples figuras por ventana GUI #
Estado #
Discusión
Sucursales y solicitudes de extracción #
Trabajo anterior : https://github.com/matplotlib/matplotlib/pull/2465 Para eliminar
Resumen #
Agregue la posibilidad de tener múltiples figuras agrupadas bajo el mismo
FigureManager
Descripción detallada #
Bajo la estructura actual, cada lienzo tiene su propia ventana.
Este es y puede seguir siendo el método de operación deseado para la mayoría de los casos de uso.
A veces, cuando hay demasiadas figuras abiertas al mismo tiempo, es deseable poder agruparlas en la misma ventana [ver] ( https://github.com/matplotlib/matplotlib/issues/2194 ).
La solución propuesta se modifica FigureManagerBasepara contener y administrar más de uno Canvas. El parámetro de configuración rcParams["backend.multifigure"]controla cuándo se desea el comportamiento de MultiFigura .
Nota
Es importante tener en cuenta que la solución propuesta asume que [MEP22] ( https://github.com/matplotlib/matplotlib/wiki/Mep22 ) ya está implementado. Esto se debe simplemente a que la implementación real de Toolbarhace que sea bastante difícil cambiar entre lienzos.
Implementación #
La primera implementación se realizará en GTK3 usando un Notebook como contenedor de lienzo.
FigureManagerBase#
agregará los siguientes nuevos métodos
add_canvas: Para agregar un lienzo a unFigureManagerobjeto existenteremove_canvas: Para quitar un lienzo de unFigureManagerobjeto, si es el último, será destruidomove_canvas: Para mover un lienzo de unoFigureManagera otro.set_canvas_title: Para cambiar el título asociado con un contenedor de lienzo específicoget_canvas_title: Para obtener el título asociado con un contenedor de lienzo específicoget_active_canvas: para obtener el lienzo que está en primer plano y está sujeto a los eventos de interfaz gráfica de usuario. No hayset_active_canvasporque el lienzo activo se define cuandoshowse llama a unCanvasobjeto.
new_figure_manager#
Para controlar cuál FigureManagercontendrá las nuevas figuras, se agregará un parámetro adicional opcional figuremanager , el valor de este parámetro se pasará a new_figure_manager_given_figure.
new_figure_manager_given_figure#
Si se proporciona el parámetro figuremanager
FigureManager, se utilizará este objeto en lugar de crear uno nuevo.Si
rcParams['backend.multifigure']es verdadero:FigureManagerse usará el último objeto en lugar de crear uno nuevo.
Compatibilidad con versiones anteriores #
Para que las propiedades de MultiFigura sean visibles, el usuario tiene que activarlas directamente configurandorcParams['backend.multifigure'] =
True
Debería ser compatible con versiones anteriores para backends que se adhieren a la FigureManagerBaseestructura actual, incluso si aún no han implementado la magia de MultiFigura .
Alternativas #
En lugar de modificar FigureManagerBase, podría ser posible agregar una clase paralela, que maneje los casos en los que
 . Esto garantizará que no habrá ningún problema con los backends personalizados, pero también hace que el código sea más grande y que haya más cosas que mantener.rcParams['backend.multifigure'] = True