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()
只被調用一次?在上面的例子中,它不會有太大的變化,但是在更復雜的情況下,可以單獨調用或分組的數十個函數,重複繪製更加明顯,並且能夠避免它。我想過使用裝飾器,但它看起來並不簡單。
任何想法?
對於'重複'問題抱歉 - 我仍然想探索裝飾者路線,但是它聽起來很多評論,好像這會有點'錯誤',所以想看看是否有其他可能的解決方案。 – astrofrog 2010-03-27 23:39:53
iPython特定的方法可能是鉤子,http://ipython.scipy.org/doc/manual/html/api/generated/IPython.core.hooks.html - 刷新例如在'pre_prompt_hook'中 - 但爲什麼強制你的代碼只用iPython? – 2010-03-28 00:19:13