Maya Python 3 UI开发遇Object not found错误,求排查解决
问题原因
Maya UI控件的changeCommand默认会把控件当前的数值作为第一个参数传入回调函数。你写的do_set_interval把第一个参数当成了控件IDbake_on_ifg,导致用输入的数字去查询intFieldGrp,自然会报“Object 'x' not found”的错误——因为Maya找不到名为数字的UI控件。
解决方案
通过lambda表达式或者functools.partial,手动把控件ID传递给回调函数,避免参数混淆。
方法1:使用Lambda包装回调
修改UI创建部分的changeCommand绑定,用lambda把控件ID传给do_set_interval:
import maya.cmds as cmds def do_set_interval(bake_on_ifg, *args): interval = cmds.intFieldGrp(bake_on_ifg, q=True, value=1) print(f"烘焙采样间隔: {interval}") # 验证输出 def create_ui(): window = cmds.window(title="Reverse FK Tool", width=260) main_layout = cmds.columnLayout(adjustableColumn=True) bake_on_ifg = cmds.intFieldGrp(label="Bake FK on", parent=main_layout, changeCommand=lambda *args: do_set_interval(bake_on_ifg, *args)) cmds.showWindow(window) if __name__ == "__main__": create_ui()
方法2:使用functools.partial
如果需要更清晰的参数绑定,可以用functools.partial:
import maya.cmds as cmds import functools def do_set_interval(bake_on_ifg, *args): interval = cmds.intFieldGrp(bake_on_ifg, q=True, value=1) print(f"烘焙采样间隔: {interval}") def create_ui(): window = cmds.window(title="Reverse FK Tool", width=260) main_layout = cmds.columnLayout(adjustableColumn=True) bake_on_ifg = cmds.intFieldGrp(label="Bake FK on", parent=main_layout, changeCommand=functools.partial(do_set_interval, bake_on_ifg)) cmds.showWindow(window) if __name__ == "__main__": create_ui()
原理说明
两种方法都是为了覆盖Maya默认的参数传递逻辑,让回调函数先拿到正确的控件ID,再通过cmds.intFieldGrp查询数值,而不是把输入的数字当成控件ID去查询。
内容的提问来源于stack exchange,提问作者Luke Coleman
相关产品推荐
相关产品推荐

