回撥函式

許多小部件包括當使用者與小部件互動時可以觸發回撥函式的事件。例如,當按下按鈕,選中核取方塊或選擇下拉選單時,你可以觸發功能。

與這些事件關聯的確切標誌取決於小部件,但典型的回撥將如下所示:

 def callback_fn(_ignore):
     print "button pressed"

 button = cmds.button(label='press me', command = callback_fn)

按下按鈕將按下按鈕列印到收聽者視窗。大多數小部件在其回撥啟用時觸發一些引數 - 例如 button 總是包含一個布林值 - 因此你需要確保回撥處理程式具有正確的簽名以與你正在使用的小部件一起使用。這就是為什麼 callback_fn() 即使它不需要它也會參與爭論的原因。

回撥分配

Maya 支援兩種不同的附加回撥函式的方法:

   # this works, but is not a great idea
   cmds.button(label = 'string reference', command = 'string_name_of_function')
   # use this form whenever possible
   cmds.button(label = 'direct function reference', command = callback_fn)

在第一個示例中,回撥由字串值指定。Maya 將在全域性 Python 範圍內找到回撥 - 在編寫正確組織的程式碼時通常很難訪問。字串名稱回撥的解析速度也較慢。第二個示例將實際的 Python 函式傳遞給回撥 - 這個表單是首選,因為它更快,如果你未能為回撥函式提供有效的函式,你將知道何時建立 UI 而不是何時建立 UI 實際上使用了 UI 小部件。

如果要將引數值傳遞給回撥函式,可以使用 lambda閉包functools.partial繫結引數來回撥。

使用 partial

 from functools import partial
 ....
 def callback_fn(myValue, _ignore):  # _ignore swallows the original button argument
     print myValue

 button = cmds.button(label='press me', command = partial(callback_fn, "fooo"))

使用 lambda

 def callback_fn(myValue):
     print myValue

 button = cmds.button(label='press me', command = lambda _ignore: callback_fn("fooo"))
 # here the lambda needs to handle the button argument

使用閉包

b = cmds.button(label = 'press me')
# by defining this function when `b` exists, we can use it later
# without storing it explicitly
def get_button_label(*_):
    print "label of button", b, " is ", cmds.button(b, q=True, l=True)
cmds.button(b, e=True, c=get_button_label)

有”更多關於字串回撥名稱與回撥函式這裡