2013-02-13 81 views
1

在Matplotlib:Matplotlib窗口类? OO相当于matplotlib.pyplot.close()?

  • 我可以写matplotlib.pyplot.cla()作为axes.clear(),其中axesmatplotlib.axes.Axes对象。
  • 我可以写matplotlib.pyplot.clf()作为fig.clear(),其中figmatplotlib.figure.Figure对象。

然后有matplotlib.pyplot.close()。这关闭了一个窗口。这个窗口是否对应于任何类别?有x.close()相当于matplotlib.pyplot.close(),但在一个更加面向对象的风格?

matplotlib.pyplot.close()我的版本的源代码如下:

if len(args)==0: 
    figManager = _pylab_helpers.Gcf.get_active() 
    if figManager is None: return 
    else: 
     _pylab_helpers.Gcf.destroy(figManager.num) 
elif len(args)==1: 
    arg = args[0] 
    if arg=='all': 
     _pylab_helpers.Gcf.destroy_all() 
    elif isinstance(arg, int): 
     _pylab_helpers.Gcf.destroy(arg) 
    elif is_string_like(arg): 
     allLabels = get_figlabels() 
     if arg in allLabels: 
      num = get_fignums()[allLabels.index(arg)] 
      _pylab_helpers.Gcf.destroy(num) 
    elif isinstance(arg, Figure): 
     _pylab_helpers.Gcf.destroy_fig(arg) 
    else: 
     raise TypeError('Unrecognized argument type %s to close'%type(arg)) 
else: 
    raise TypeError('close takes 0 or 1 arguments') 

所以,这似乎是基于静态方法的 matplotlib._pylab_helpers.Gcf.destroy它做了各种各样的事情,我不知道情况,并指出, 在交互式后端中,这被绑定到窗口“销毁”和“删除”事件。但我不确定数字和窗口是如何相关的。

也许我在浪费我的时间,甚至想到这个。

+0

我可以提供的最好建议:不要害怕看pyplot源代码。我会在接下来的几天发布一个答案,如果其他人(或者你甚至)不会打败我:-) HTH – pelson 2013-02-13 20:07:06

回答

2

Gcf是一个全局单例对象,用于保存用plt.figure打开的数字列表。

它本质上是一个字典,它周围有一些奇特的代码来保持事物的一致性并跟踪活动的数字等。用作Figure(这是plt.figure返回的内容)与GUI层之间的层的类是FigureManagerBase(以及它的每个工具包子类),它在backend_bases.py中定义。

您正在使用哪个子类是由您正在使用的后端决定的。这些子类处理诸如确保在单击“x”按钮时系统被删除以及系统级gui回叫等事情。

FigureManager s有一个destroy方法触发其内部拆除。原则上,如果你有一个Figure对象并且想要手工销毁它,你只需要获得一个经理的持有权。它的一个引用没有存储在Figure对象,而是存储在Canvas对象,以便您可以通过

fig.canvas.manager.destroy() 

将撕裂下来身影摧毁一个窗口,但如果你这样做,它可能不是妥善清理Gcf(这将保留对图管理员的参考),这将使未来的数字与pyplot有意想不到的数字(它不会回到一个),gca将无法​​正常工作等情况下(这是这种情况与Qt4)。

如果你要使用在所有pyplot(并确保它总是在每一个后台运行),那么您可能需要

  1. 直接对话Gcf(它在_pyplot_helpers.py,真的没有太复杂了,一旦你看到它是什么要做
  2. 范围和直接对话的GUI(见lib/matplotlib/tests/test_backend_qt4.py为如何与qt4做的代码,但是这将是非常工具箱依赖)
  3. plt.close(fig.number)
+0

对不起,'关闭'应该已经被清除,现在已经修复。 – gerrit 2013-02-13 22:06:43

+0

@gerrit k,删除了答案的那一点。 – tacaswell 2013-02-13 22:11:20