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()
global
data
範囲内に置くことは許容される解決策ではありません。関数は自己完結型でなければなりません。答えがhereの場合、callback()
に変数を渡すことができますが、私はそれらを編集することはできません。
ネストされた関数を使用します(funの本体でコールバックを定義します)。しかし、あなたのコールバックが呼び出されるときに、fun関数がすでに終了していることに気づくでしょう。 –
私はすでに '' 'fun()' ''でネストされた関数を試しました。それはうまくいきません。ネストされた '' 'callback()' ''は '' 'fun()' ''のスコープにアクセスできますが、それを変更することはできません。自分で試してみてください。また、通常は、 '' 'plt.show()' ''が解決されるまで(つまり、キャンバスインタラクション後に)関数は終了しません。上記のスクリプトでは早すぎる終了に関する問題はありません。 – SkyNT
事実、litteのトリックを使用することができます。 http://stackoverflow.com/questions/6198709/how-do-i-change-nesting-functions-variable-in-the-nested-functionを参照してください。 d = dict(data = 0)のようなdictを使用して、ネストされた関数のd ["data"]を変更することができます。 –