Maya Python重命名工具报错:对象未找到问题求助
问题描述
我正在编写一款带有特定参数选择和自定义对象名称输入框的基础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自然找不到对应对象,抛出报错。
修复步骤
修正参数传递顺序
调整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(文本框)
可选优化:参数命名更清晰
为避免再次出现顺序错误,给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) # 后续逻辑不变额外检查:指定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

