You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Maya Python重命名工具报错:对象未找到问题求助

Maya重命名工具按钮点击报错排查

问题描述

我正在编写一款带有特定参数选择和自定义对象名称输入框的基础Maya重命名工具,UI部分运行正常,但点击按钮时出现错误:

line 107: Object 'preFlightCheckUI|columnLayout13|frameLayout57|rowColumnLayout27|textField26' not found. #

附上相关代码,恳请帮忙排查解决!

def build_asset_def(window, main_layout02):

    assetDef = cmds.frameLayout(label='Define Asset Name', width= 300, height= 400, collapsable= True, parent= main_layout02)

    baf = cmds.rowColumnLayout(numberOfColumns= 2, columnWidth= [(1,150), (2,150)], columnOffset= [(1, 'both', 5), (2, 'both', 5)], parent= assetDef)

    #text labels
    cmds.text(label='Define Project Name:', align= 'right', font= 'boldLabelFont', height= 30, parent= baf) 


    pre_proj_name = cmds.optionMenu()
    prefix_menu_items01 = ['DRAGON', 'BATMAN']

    for label_01 in prefix_menu_items01:
        cmds.menuItem(pre_proj_name, label= label_01)

    cmds.text(label='\tDepartment Name:\t', align= 'right', font= 'boldLabelFont', height= 30, parent= baf) 

    dep_name = cmds.optionMenu(label= 'Prefix:\t')
    menu_items02 = ['MOD', 'LookDev','Texture', 'Proxy']

    for label_02 in menu_items02:
        cmds.menuItem(dep_name, label= label_02)

    cmds.text(label='\tAsset Type:\t', align= 'right', font= 'boldLabelFont', height= 30, parent= baf)  

    asset_type = cmds.optionMenu()
    menu_items03 = ['Char', 'Enviro','Prop']

    for label_03 in menu_items03:
        cmds.menuItem(asset_type, label= label_03)

    cmds.text(label='\tAsset Name:\t', align= 'right', font= 'boldLabelFont', height= 30, parent= baf)

    asset_name = cmds.textField(text= '')

    cmds.text(label='\tMaterial ID:\t', align= 'right', font= 'boldLabelFont', height= 30, parent= baf) 

    suffix_material_type = cmds.optionMenu()
    suffix_menu_material_id = ['Skin', 'Teeth','Gums', 'Dirt']

    for label in suffix_menu_material_id:
        cmds.menuItem(suffix_material_type, label= label)

    applyBttn = cmds.button(label= 'Rename', height= 50, width= 300, command= partial(name_obj, pre_proj_name, dep_name, asset_type, asset_name, suffix_material_type))

def name_obj(prefix_element, suffix_element, depart_element, type_element, asset_name_element, *args):

    prefix = cmds.optionMenu(prefix_element, query= True, value= True)
    suffix = cmds.optionMenu(suffix_element, query=True, value= True)
    department = cmds.optionMenu(depart_element, query=True, value= True)
    assetType = cmds.optionMenu(type_element, query= True, value= True)
    assetName = cmds.textField(asset_name_element, query= True, text= True)

    name_template = '{prefix}_{department}_{type}_{new_name}_{suffix}_{index}'

    for i, obj in enumerate(cmds.ls(selection= True)):
        new_object_name = name_template.format(prefix=prefix, department= department, type= assetType, new_name= assetName, suffix= suffix, index= i)
        cmds.rename(obj, new_object_name)

问题原因与解决方法

核心问题:参数传递顺序完全错误

你调用partial(name_obj, pre_proj_name, dep_name, asset_type, asset_name, suffix_material_type)时,传递的参数顺序和name_obj函数定义的参数顺序不匹配,导致原本该传给asset_name_element的文本框控件被传到了错误位置,最终查询文本框内容时找不到正确的UI对象。

函数定义的参数顺序是:prefix_element、suffix_element、depart_element、type_element、asset_name_element
而你实际传递的顺序是:项目名菜单、部门菜单、资产类型菜单、文本框、材质ID菜单

当执行到assetName = cmds.textField(asset_name_element, query= True, text= True)时,传入的是材质ID菜单(一个optionMenu控件),用cmds.textField查询非文本框控件,Maya自然找不到对应对象,抛出报错。

修复步骤

  1. 修正参数传递顺序
    调整partial的参数顺序,让其与name_obj的参数定义一一对应:

    applyBttn = cmds.button(label= 'Rename', height= 50, width= 300, command= partial(name_obj, pre_proj_name, suffix_material_type, dep_name, asset_type, asset_name))
    

    对应关系:

    • prefix_element → pre_proj_name(项目名菜单)
    • suffix_element → suffix_material_type(材质ID菜单)
    • depart_element → dep_name(部门菜单)
    • type_element → asset_type(资产类型菜单)
    • asset_name_element → asset_name(文本框)
  2. 可选优化:参数命名更清晰
    为避免再次出现顺序错误,给name_obj的参数起更直观的名字:

    def name_obj(proj_menu, material_menu, dept_menu, type_menu, name_textfield, *args):
        prefix = cmds.optionMenu(proj_menu, query= True, value= True)
        suffix = cmds.optionMenu(material_menu, query=True, value= True)
        department = cmds.optionMenu(dept_menu, query=True, value= True)
        assetType = cmds.optionMenu(type_menu, query= True, value= True)
        assetName = cmds.textField(name_textfield, query= True, text= True)
        # 后续逻辑不变
    
  3. 额外检查:指定UI控件的父布局
    所有optionMenu和textField都未指定parent=baf,虽然Maya会默认放到当前活跃布局,但为避免意外,建议给每个UI控件加上该参数,比如:

    pre_proj_name = cmds.optionMenu(parent=baf)
    dep_name = cmds.optionMenu(label= 'Prefix:\t', parent=baf)
    asset_type = cmds.optionMenu(parent=baf)
    asset_name = cmds.textField(text= '', parent=baf)
    suffix_material_type = cmds.optionMenu(parent=baf)
    

内容的提问来源于stack exchange,提问作者gus1234

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 17:36:15