Matplotlib non prevede 'casa', 'Indietro' o 'in avanti' evento pulsante.
Per aggiungere un callback che verrà chiamato con l'evento del pulsante 'home', 'back' o 'forward', un approccio comune è quello di sottoclasse di un backend matplotlib.
Ma io non sono favorevole a questo approccio. Io penso che abbia due svantaggi:
- Se si desidera utilizzare diversi backend, è necessario sottoclasse ciascuno di essi.
- Distribuire il proprio backend al di fuori di matplotlib non è banale. Il tuo back-end deve essere un modulo che deve essere in PYTHONPATH.
Poiché nessuno dei backend forniti da matplotlib sovrascrive home
, back
e forward
metodi NavigationToolbar2
s'.Preferisco l'approccio più conciso per le scimmie.
Ad esempio, è possibile sostituire lo home
con il proprio metodo.
import matplotlib.pyplot as plt
from matplotlib.backend_bases import NavigationToolbar2
home = NavigationToolbar2.home
def new_home(self, *args, **kwargs):
print 'new home'
home(self, *args, **kwargs)
NavigationToolbar2.home = new_home
fig = plt.figure()
plt.text(0.35, 0.5, 'Hello world!', dict(size=30))
plt.show()
Possiamo stile anche di matplotlib mimica mpl_connect
.
import matplotlib.pyplot as plt
from matplotlib.backend_bases import NavigationToolbar2, Event
home = NavigationToolbar2.home
def new_home(self, *args, **kwargs):
s = 'home_event'
event = Event(s, self)
event.foo = 100
self.canvas.callbacks.process(s, event)
home(self, *args, **kwargs)
NavigationToolbar2.home = new_home
def handle_home(evt):
print 'new home'
print evt.foo
fig = plt.figure()
fig.canvas.mpl_connect('home_event', handle_home)
plt.text(0.35, 0.5, 'Hello world!', dict(size=30))
plt.show()
mi rendo conto che accettare una risposta non costituisce l'assegnazione della taglia - leggermente non intuitiva; lieto di averlo notato con un'ora di anticipo, spero che nymk ce l'abbia fatta. molte grazie a tutte le risposte di alta qualità – bph