2010-03-27 168 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