Как определить, что ось принадлежит окну, которое было закрыто в matplotlib - PullRequest
1 голос
/ 17 мая 2011

В 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)

Моя цель - найти функцию, такую ​​как own_to_a_closed_window

1 Ответ

4 голосов
/ 17 мая 2011

Почему бы просто не подключить обратный вызов к "close_event"?Вы можете добавить флаг ax.has_been_closed к объекту axes или самому вашему классу.(Возможно, есть даже более чистые решения, чем флаг 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 не реализует событие закрытия должным образом, вы также можете сделать что-то вроде этого:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...