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

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)

关键修改点说明

  1. 定位器变量处理:把loc = cmds.spaceLocator(...)改成loc = cmds.spaceLocator(...)[0],直接拿到定位器的字符串名称,避免列表拼接错误。
  2. 移除无效循环:删掉for s in sel:循环,因为你是一次性处理选中的5个节点,不需要遍历每个选中项。
  3. 约束节点存储:给cmds.parentConstraint的返回值赋值给const,这样才能正确删除约束。
  4. 参数全称化:把connectAttr里的f改成force=True,符合Python的语法要求。
  5. 增加校验:加了选中节点数量的判断,避免因选中数量不对导致的报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 06:25:24