2012-04-24 11 views
1

ウィンドウを閉じたときに破棄されるウィンドウオブジェクトにリスナーをアタッチしようとしています。ラッパーの円引数の必要条件

しかし、ウィンドウオブジェクトには、Xをクリックして呼び出すタイプのOnCloseタイプのメソッドがありません(理由は興味がある場合はAutodesk Mayaの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) 

関数が宣言された後、しかし、私はそれを最初に定義せずadd_listenerに関数を渡すことはできませんまでid_numberが定義されていないので、これは明らかに動作しません。 id_numberadd_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

シャックス:\ 次のようにハックすることができます。それは私に知らせていない場合は ....私は

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

関連する問題