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 un FigureManagerobjeto existente

  • remove_canvas: Para quitar un lienzo de un FigureManagerobjeto, si es el último, será destruido

  • move_canvas: Para mover un lienzo de uno FigureManager a otro.

  • set_canvas_title: Para cambiar el título asociado con un contenedor de lienzo específico

  • get_canvas_title: Para obtener el título asociado con un contenedor de lienzo específico

  • get_active_canvas: para obtener el lienzo que está en primer plano y está sujeto a los eventos de interfaz gráfica de usuario. No hay set_active_canvas porque el lienzo activo se define cuando showse llama a un Canvasobjeto.

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 figuremanagerFigureManager , 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