如何检测轴属于matplotlib中已关闭的窗口

时间:2011-05-17 07:29:25

标签: python 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

之类的函数

1 个答案:

答案 0 :(得分:4)

为什么不将回调连接到"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后端没有正确实现关闭事件,你也可以这样做:

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)