回调函数

许多小部件包括当用户与小部件交互时可以触发回调函数的事件。例如,当按下按钮,选中复选框或选择下拉菜单时,你可以触发功能。

与这些事件关联的确切标志取决于小部件,但典型的回调将如下所示:

 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)

有”更多关于字符串回调名称与回调函数这里