2010-03-27 149 views
0

比方说,我定义的一些功能做某些matplotlib动作,如Matplotlib画布绘制

def dostuff(ax): 
    ax.scatter([0.],[0.]) 

现在,如果我启动ipython,我可以加载这些功能,并开始一个新的数字:

In [1]: import matplotlib.pyplot as mpl 

In [2]: fig = mpl.figure() 

In [3]: ax = fig.add_subplot(1,1,1) 

In [4]: run functions # run the file with the above defined function 

如果我现在请dostuff,那么这个数字不刷新:

In [6]: dostuff(ax) 

我必须然后明确地运行:

In [7]: fig.canvas.draw() 

要获取画布绘制。现在我可以修改dostuff为

def dostuff(ax): 
    ax.scatter([0.],[0.]) 
    ax.get_figure().canvas.draw() 

这将自动重新绘制画布。但现在,说我有以下代码:

def dostuff1(ax): 
    ax.scatter([0.],[0.]) 
    ax.get_figure().canvas.draw() 

def dostuff2(ax): 
    ax.scatter([1.],[1.]) 
    ax.get_figure().canvas.draw() 

def doboth(ax): 
    dostuff1(ax) 
    dostuff2(ax) 
    ax.get_figure().canvas.draw() 

我可以调用每个函数,并在画布上会被重绘,但在doboth()的情况下,它会得到重绘多次。

我的问题是:我怎么可以编码,这样canvas.draw()只被调用一次?在上面的例子中,它不会有太大的变化,但是在更复杂的情况下,可以单独调用或分组的数十个函数,重复绘制更加明显,并且能够避免它。我想过使用装饰器,但它看起来并不简单。

任何想法?

回答

1

为什么我对this SO question of yours关于“刷新修饰器”的回答使它变得简单?我准确地展示了你要做什么再次请求在这里(通过保持嵌套的计数 - 顺便说一下,也是线程安全的),并且你完全忽略了我的答案......特殊行为!) -

+0

对于'重复'问题抱歉 - 我仍然想探索装饰者路线,但是它听起来很多评论,好像这会有点'错误',所以想看看是否有其他可能的解决方案。 – astrofrog 2010-03-27 23:39:53

+0

iPython特定的方法可能是钩子,http://ipython.scipy.org/doc/manual/html/api/generated/IPython.core.hooks.html - 刷新例如在'pre_prompt_hook'中 - 但为什么强制你的代码只用iPython? – 2010-03-28 00:19:13