2011-05-17 1 views
1

В matplotlib я сохраняю ссылку на ось. Я хочу открыть новую фигуру, если окно, содержащее ось, было закрыто. Идея состоит в том, чтобы продолжать добавлять графики на фигуре, пока она не будет закрыта, затем я открою новую фигуру. Обратите внимание, что создание новых графиков инициируется событием на другом рисунке.Как определить, что ось принадлежит окну, которое было закрыто в matplotlib

Если это может помочь вам понять, что я пытаюсь сделать, вот класс:

class DetailedPlot(object): 
    def __init__(self, figure): 
     self.origin_figure = figure 

     self.axis = None 
     self.print_figure = None 

     self.origin_figure.canvas.mpl_connect('button_press_event', self) 


    def __call__(self, event): 
     if event.xdata is None or event.ydata is None: 
      return 
     r = round(event.xdata - 0.025, 1) 
     l = round(event.ydata - 0.025, 1) 
     if self.axis is None or self.axis.belongs_to_a_closed_window(): 
      self.print_figure = plt.figure() 
      self.axis = self.print_figure.add_subplot(111) 
     plotting_fcn(self.axis, r, l) 

Моя цель, чтобы найти такую ​​функцию, как belongs_to_a_closed_window

ответ

3

Почему не только подключить функцию обратного вызова к "close_event"? Вы можете либо добавить флаг ax.has_been_closed к объекту осей, либо к самому классу. (Есть, вероятно, даже более чистые решения, чем «has_been_closed» флаг, в зависимости от того, что вы делаете ... Функция обратного вызова может быть что угодно.)

import matplotlib.pyplot as plt 

def on_close(event): 
    event.canvas.figure.axes[0].has_been_closed = True 
    print 'Closed Figure' 

fig = plt.figure() 
ax = fig.add_subplot(111) 
ax.has_been_closed = False 
ax.plot(range(10)) 

fig.canvas.mpl_connect('close_event', on_close) 

plt.show() 

print ax.has_been_closed 

Edit: (Расширение на мой комментарий ниже) Если бэкенд конец OSX не правильно реализовать событие закрытия, вы можете также сделать что-то вроде этого:

import matplotlib.pyplot as plt 

def has_been_closed(ax): 
    fig = ax.figure.canvas.manager 
    active_fig_managers = plt._pylab_helpers.Gcf.figs.values() 
    return fig not in active_fig_managers 

fig = plt.figure() 
ax = fig.add_subplot(111) 
ax.plot(range(10)) 

print has_been_closed(ax) 

plt.show() 

print has_been_closed(ax) 
+0

Я уже пытался что-то в том, что мода, это не сработало, так что я думал, что это не работает так, как Я думал. Похоже, есть ошибка с бэкэндом OsX, даже если вы пример не запускаете событие закрытия ... – Steve

+0

@Steve - Хм ... Ну, если бэкэнд OsX глючит, вы можете попробовать протестировать 'fig.canvas .manager в plt._pylab_helpers.Gcf.figs.values ​​() 'Это взломанный, но он должен работать ... (также, если вы хотите проверить его из экземпляра осей, вы используете' ax.figure.canvas.manager' вместо 'fig.canvas.manager') –

Смежные вопросы