2012-04-24 2 views
1

Я пытаюсь подключить слушателя к объекту окна, который уничтожается при закрытии окна.Требование о круговом аргументе для обертки

Однако объект окна не имеет метода типа OnClose, который вызывается нажатием кнопки X, чтобы закрыть (это Autodesk Maya's pymel.core.uitypes.Window, если вам интересно, почему).

add_listener создает слушатель, который существует в активной сессии. attach_listener Я создаю, чтобы заставить слушателя удалять себя, когда окно закрывается, и требует подключения к окну.

Мое решение заключается в следующем:

def attach_listener(window, event_name, function): 
    def wrapper(*args, **kwargs): 
     if window.exists(): 
      return function(*args, **kwargs) 
     else: 
      remove_listener(id_number) 
    id_number = add_listener(event_name, wrapper) 

Это, очевидно, не будет работать, потому что id_number не не определен до тех пор, после того, как функция объявлена, однако, я не могу передать функцию add_listener без определения его первым. id_number не может быть передан add_listener. Что мне делать, чтобы обойти это?

ответ

2

Вы можете попробовать такой подход:

def attach_listener(window, event_name, function): 
    def wrapper(*args, **kwargs): 
     if window.exists(): 
      return function(*args, **kwargs) 
     else: 
      remove_listener(wrapper.id_number) 
    wrapper.id_number = add_listener(event_name, wrapper) 
0

Shacks: \ Вы можете взломать его следующим образом; Я думаю, что это будет работать ....

def attach_listener(window, event_name, function): 
    IDlist = [] 
    def wrapper(*args, **kwargs): 
     if window.exists(): 
      return function(*args, **kwargs) 
     else: 
      remove_listener(IDlist[0]) 
    IDlist.append(add_listener(event_name, wrapper)) 

Не самый элегантный способ сделать это, но он должен работать .... Если это не дает мне знать.

+0

К сожалению, Майя работает в Python 2.6, так что 'nonlocal' не существует. – TorelTwiddler

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

  • Нет связанных вопросов^_^