2016-10-06 3 views
0

matplotlibの図がクリックされたときにコールバックcallback()をバインドする関数fun()があります。私は、このコールバックがfun()の変数空間にアクセスして変更できるようにしたいと思います。これについてどうすればいいですか?Pythonコールバック変数スコープ

import numpy as np 
import matplotlib.pyplot as plt 

def callback(event): 
    data = event.xdata 

def fun(): 
    data = 0 

    fig, ax = plt.subplots() 
    ax.plot(np.random.rand(12), np.random.rand(12), 'go') 
    fig.canvas.mpl_connect('button_release_event', callback) 

    plt.show() 
    return data 

print fun() 

globaldata範囲内に置くことは許容される解決策ではありません。関数は自己完結型でなければなりません。答えがhereの場合、callback()に変数を渡すことができますが、私はそれらを編集することはできません。

+0

ネストされた関数を使用します(funの本体でコールバックを定義します)。しかし、あなたのコールバックが呼び出されるときに、fun関数がすでに終了していることに気づくでしょう。 –

+0

私はすでに '' 'fun()' ''でネストされた関数を試しました。それはうまくいきません。ネストされた '' 'callback()' ''は '' 'fun()' ''のスコープにアクセスできますが、それを変更することはできません。自分で試してみてください。また、通常は、 '' 'plt.show()' ''が解決されるまで(つまり、キャンバスインタラクション後に)関数は終了しません。上記のスクリプトでは早すぎる終了に関する問題はありません。 – SkyNT

+0

事実、litteのトリックを使用することができます。 http://stackoverflow.com/questions/6198709/how-do-i-change-nesting-functions-variable-in-the-nested-functionを参照してください。 d = dict(data = 0)のようなdictを使用して、ネストされた関数のd ["data"]を変更することができます。 –

答えて

1

私は、あなたが実行時に変更することができるいくつかの状態を持ちたいと思います。私たちは、イベントが発生する頻度カウンタを持っているでしょう

class Callback(object): 
    def __init__(self, data): 
     self.data = data 
    def __call__(self, event): 
     # Manipulate the data 
     self.data += 1 
... 
datacallback = Callback(0) 
fig.canvas.mpl_connect('button_release_event', datacallback) 
print datacallback.data 

その方法:1つのオプションは、それが機能(私はそれをテストしていない)ではない、呼び出し可能オブジェクトを使用するかもしれません。しかし、それはどんな種類のデータでも動作し、整数よりも複雑です。

+0

私はちょうどそれをテストし、それは動作します。これは私の問題を解決します。 – SkyNT

関連する問題