PAYATHON 2026

Maya Python 3 的 intFieldGrp 回调为何报 Object not found?

数据小陈

结论

创建 intFieldGrp 后,需要将返回的控件名称显式绑定到回调,并用 value1=True 查询第一个输入框。

报错中的对象名恰好是输入的数字,说明回调执行时,do_set_interval() 的第一个参数接收了输入值。随后,这个值被当作控件名称传给 cmds.intFieldGrp(),导致出现 Object 'x' not found。

为什么同名参数没有接收到控件名称?

下面两处的 bake_on_ifg 分别是局部变量和函数参数,不会因为名字相同而自动关联:

bake_on_ifg = cmds.intFieldGrp(...)

def do_set_interval(bake_on_ifg, *args):
    ...

changeCommand=do_set_interval 只是注册了函数。调用时的参数来自 Maya 的回调机制;要传入创建控件时得到的名称,需要自行绑定。

查询时,value=1 不表示查询第一个输入框:value 查询整组值,value1 对应第一个输入框。这两个标志及控件名称的返回形式可查阅 Autodesk intFieldGrp 文档。

修改后的完整示例

先创建控件并取得名称,再用 functools.partial 注册回调。示例用字典保存采样间隔,供后续操作读取。

from functools import partial
import maya.cmds as cmds


def do_set_interval(bake_on_ifg, settings, *args):
    interval = cmds.intFieldGrp(
        bake_on_ifg,
        q=True,
        value1=True,
    )
    settings["interval"] = interval
    print("Bake interval:", interval)


def create_ui():
    settings = {"interval": 1}

    window = cmds.window(title="Reverse FK Tool", width=260)
    main_layout = cmds.columnLayout(
        parent=window,
        adjustableColumn=True,
    )

    bake_on_ifg = cmds.intFieldGrp(
        label="Bake FK on",
        parent=main_layout,
        numberOfFields=1,
        value1=settings["interval"],
    )

    cmds.intFieldGrp(
        bake_on_ifg,
        e=True,
        changeCommand=partial(
            do_set_interval,
            bake_on_ifg,
            settings,
        ),
    )

    cmds.showWindow(window)
    return settings


if __name__ == "__main__":
    settings = create_ui()

partial 将控件名称和设置字典固定为前两个参数。Maya 触发回调时传入的额外参数由 *args 接收,不参与控件查询。

回调执行后,后续代码可以通过 settings["interval"] 读取保存的间隔。示例只保存设置,不执行烘焙,也不将设置写入磁盘。

还需要注意什么?

  • 原代码中的 interval 是回调函数的局部变量,赋值后其他函数无法直接读取。若需要跨函数使用,应将它保存到共享状态或工具实例的属性中。
  • 粘贴的代码缺少函数体和 if 语句体的缩进。上面的示例已补齐;如果实际代码也缺少缩进,会先出现 IndentationError。
  • changeCommand 对应字段值发生变化,不是专门的 Enter 按键事件。若要专门响应 Enter,可以考虑使用带 enterCommand 的 intField。官方文档将该事件描述为数字键盘 Enter,具体交互应在使用的 Maya 环境中确认。参见 Autodesk intField 文档。
  • 示例尚未连接实际烘焙命令。如果后续操作要求采样间隔为正整数,应在使用该设置前检查数值范围。

备注:内容仅供参考。