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 文档。- 示例尚未连接实际烘焙命令。如果后续操作要求采样间隔为正整数,应在使用该设置前检查数值范围。
备注:内容仅供参考。
