В 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
Почему бы просто не подключить обратный вызов к "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
Изменить: (Расширение на моем комментарии ниже). Если бэкэнд-конец OSX неправильно реализует событие close, вы также можете сделать что-то вроде этого:
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)
fig.canvas.manager in plt._pylab_helpers.Gcf.figs.values()
Хакерский, но он должен работать ... (также, если вы хотите протестировать его из экземпляра оси, вы используетеax.figure.canvas.manager
вместоfig.canvas.manager
)