2012-10-02 17 views
10

¿Es posible hacer algo como lo siguiente para modificar la barra de herramientas de navegación en matplotlib?¿Cómo modificar la barra de herramientas de navegación fácilmente en una ventana de figura matplotlib?

  1. generar una ventana de figura, con: fig = figure()
  2. obtener una referencia de la herramienta de la barra de navegación, con: tbar = fig.get_navigation_toolbar(), o mejor aún, simplemente por: tbar = fig.navtbar
  3. Modificar la herramienta de la barra a través de la tbar referencia, tales como eliminar/añadir/editar un botón con algo como esto:
        tbar.add_button(<a Button object>);
        tbar.remove_button(a reference to a button);
        tbar.edit_button(a reference to a button);
  4. Actualización de la figura con: fig.canvas.draw()

Muchas gracias.

+0

¿Ayuda http://dalelane.co.uk/blog/?p=778? – halex

+0

Bueno, vi esta solución antes. Estoy buscando algo aún más simple si es posible.Tengo la sensación de que es posible que no se pueda editar el objeto de la barra de herramientas de navegación directamente, por lo que es posible que tenga que conformarme con la solución que mencionó. Gracias :-) – JBT

Respuesta

16

La forma que encontré para eliminar los elementos de la barra de herramientas no deseados es crear una subclase, que se crea una instancia y se utiliza en una aplicación GTK. Como de forma manual creo figura, FigureCanvas y NavigationToolbar objetos de todos modos, esta fue la forma más fácil.

class NavigationToolbar(NavigationToolbar2GTKAgg): 
    # only display the buttons we need 
    toolitems = [t for t in NavigationToolbar2GTKAgg.toolitems if 
       t[0] in ('Home', 'Pan', 'Zoom', 'Save')] 

Si desea crear botones personalizados, usted debe echar un vistazo a la definición de NavigationToolbar2 en backend_bases. Puede agregar fácilmente sus propias entradas a la lista toolitems y definir las funciones de devolución de llamada apropiadas en la subclase de la barra de herramientas.

+0

+1: para wx, una buena respuesta es http://dalelane.co.uk/blog/?p=778 – tom10

+0

genious solution! – SAAD

7

Con MPL 1.2.1 es posible obtener un controlador de la barra de herramientas de navegación de una figura MPL estándar a través de figure.canvas.toolbar. No estoy seguro de las versiones anteriores.

Al menos con el backend QT es posible agregar widgets arbitrarios a la barra de herramientas de navegación usando el método QT .addWidget(). Supongo que otros backends funcionarán con métodos similares, pero no los he probado.

Aquí está un ejemplo de trabajo (usando el backend del intervalo QT) que añade un QLineEdit() a la barra de herramientas de navegación para cambiar el título de una figura MPL (ejecutar desde IPython (pylab) con run -i ..., a continuación, iniciar test()):

from PySide import QtGui, QtCore 

def test(): 
    plot([1,2,3], lw=2) 
    q = qt4_interface(gcf()) 
    return q # WARNING: it's paramount to return the object otherwise, with 
       # no references, python deletes it and the GUI doesn't respond! 

class qt4_interface: 
    def __init__(self,fig): 
     self.fig = fig 

     toolbar = fig.canvas.toolbar 
     self.line_edit = QtGui.QLineEdit() 
     toolbar.addWidget(self.line_edit) 
     self.line_edit.editingFinished.connect(self.do_something) 

    def do_something(self, *args): 
     self.fig.axes[0].set_title(self.line_edit.text()) 
     self.fig.canvas.draw() 
     #f = open('l','a'); f.write('yes\n'); f.flush(); f.close() 
0

Además de la solución de torfbotl anterior, es posible que tenga un botón extra colgando al final (el que tiene la marca de verificación verde).

que puede ser mitigado en el constructor de la subclase:

from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar 

class PanOnlyToolbar(NavigationToolbar): 
    # only display the buttons we need 
    toolitems = [t for t in NavigationToolbar2GTKAgg.toolitems if 
       t[0] in ("Pan",)] 

    def __init__(self, *args, **kwargs): 
     super(PanOnlyToolbar, self).__init__(*args, **kwargs) 
     self.layout().takeAt(1) #or more than 1 if you have more buttons 
1

Las respuestas anteriores funcionan, pero son muy específicas del backend. Una solución un poco más elegante es subclase NavigationToolbar2, como se hace en esta otra respuesta: Matplotlib/Tkinter - customizing toolbar tooltips Allí el objetivo era cambiar la información sobre herramientas, pero agregar o quitar un botón es igualmente trivial.

Cuestiones relacionadas