Python回调变量范围

时间:2016-10-06 14:37:05

标签: python matplotlib scope

我有一个函数fun(),在单击matplotlib图时绑定回调callback()。我希望此回调能够访问fun()的变量空间以进行更改。我怎么能这样做呢?

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()

data置于global范围内是不可接受的解决方案。该功能应该是独立的。答案here允许我将变量传递给callback(),但不允许我编辑它们。

1 个答案:

答案 0 :(得分:2)

我知道您希望有一些状态,可以在运行时更改。一个选项可能是使用一个可调用的对象,这不是一个函数(我还没有测试过它):

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

这样我们就会有一个计数器提出事件的频率。但它适用于任何类型的数据,也比整数更复杂。