2016-10-06 3 views
0

У меня есть функция fun(), которая связывает обратный вызов callback() при щелчке по фигуре matplotlib. Я хочу, чтобы этот обратный вызов имел возможность получить доступ к переменному пространству 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() 

Ввод data в global объеме не является приемлемым решением. Функция должна быть автономной. Ответ here позволил бы мне передать переменные в callback(), но не позволял мне редактировать их.

+0

Используйте вложенную функцию (определите свой обратный вызов в теле удовольствия). Но обратите внимание, что функция fun будет уже завершена при вызове callback. –

+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. Вы можете использовать dict, например d = dict (data = 0), а затем изменить 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 

Таким образом, мы получили бы счетчик, как часто поднимается событие. Но он работает с любыми данными, также более сложными, чем целое.

+0

Я только что протестировал его, и он работает. Это решает мою проблему. – SkyNT

Смежные вопросы