Maya Python脚本报错:只能将列表与列表拼接,求新手向解答
解决Maya Python脚本的TypeError错误
核心报错原因
你遇到的TypeError: can only concatenate list (not "str") to list,是因为**cmds.spaceLocator()返回的是列表类型,不是单个字符串**。比如执行loc = cmds.spaceLocator(n=jntn+"_LOC")后,loc的值是['xxx_LOC'](带方括号的列表),直接用loc + ".translateX"等于把列表和字符串拼接,Python肯定不允许。
其他隐藏问题
除了这个报错,你的脚本还有几个逻辑问题:
- 多余的
for循环:你写了for s in sel:,但循环里直接取sel[0]到sel[4],这会导致脚本重复执行len(sel)次,完全没必要,而且如果选中的节点数不是5个,会直接报错索引越界。 - 未定义的
const变量:cmds.delete(const)里的const没赋值,cmds.parentConstraint会返回约束节点的名称,必须先把它存下来才能删除。 - 简写参数错误:
connectAttr里的f是MEL里的简写,但Python里要写全称force=True,不然会报错变量未定义。 - 冗余变量:
trans变量定义了但没用到,可以直接删掉。
修复后的完整代码
import maya.cmds as cmds # 获取选中的节点,确保选中了5个 sel = cmds.ls(sl=True) if len(sel) != 5: cmds.error("请选中5个节点:关节、控制器、渐变乘子、(冗余的trans可忽略)、 orient节点") exit() # 给选中节点赋值,去掉多余的for循环 jntn = sel[0] cntrl = sel[1] gradientMult = sel[2] orient = sel[4] # 删掉没用的trans变量 # 创建定位器,直接取列表第一个元素(转成字符串) loc = cmds.spaceLocator(n=jntn+"_LOC")[0] grp = cmds.group(empty=True, n=jntn+"_LOC_offset") cmds.parent(loc, grp) # 存储约束节点,之后删除 const = cmds.parentConstraint(jntn, grp, mo=False) cmds.delete(const) # 修复连接属性的写法:用loc[0]或者直接在创建时取第一个元素 cmds.connectAttr(loc + ".translateX", gradientMult + ".input1x", force=True) cmds.connectAttr(cntrl + ".translate", orient + ".input1", force=True) cmds.pointConstraint(cntrl, loc, mo=False)
关键修改点说明
- 定位器变量处理:把
loc = cmds.spaceLocator(...)改成loc = cmds.spaceLocator(...)[0],直接拿到定位器的字符串名称,避免列表拼接错误。 - 移除无效循环:删掉
for s in sel:循环,因为你是一次性处理选中的5个节点,不需要遍历每个选中项。 - 约束节点存储:给
cmds.parentConstraint的返回值赋值给const,这样才能正确删除约束。 - 参数全称化:把
connectAttr里的f改成force=True,符合Python的语法要求。 - 增加校验:加了选中节点数量的判断,避免因选中数量不对导致的报错。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

