Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何锁定这些属性?_Python_User Interface_Maya - Fatal编程技术网

Python 如何锁定这些属性?

Python 如何锁定这些属性?,python,user-interface,maya,Python,User Interface,Maya,我刚刚开始编码,所以我想我会尝试做一些简单的事情,但是,我无法从我的ls中选择对象,我知道错误在我的def attrLockT中,我想知道是否有人可以帮助我解决这个问题并理解我做错了什么 将maya.cmds作为cmds导入 选择属性 sat=['.tx'、'.ty'、'.tz'] sar=['.rx'、'.ry'、'.rz'] sas=['.sx'、'.sy'、'.sz'] 创建当前选定对象的列表 myList=cmds.lssl=True 锁定选定对象的“平移”属性 def attrLock

我刚刚开始编码,所以我想我会尝试做一些简单的事情,但是,我无法从我的ls中选择对象,我知道错误在我的def attrLockT中,我想知道是否有人可以帮助我解决这个问题并理解我做错了什么

将maya.cmds作为cmds导入 选择属性 sat=['.tx'、'.ty'、'.tz'] sar=['.rx'、'.ry'、'.rz'] sas=['.sx'、'.sy'、'.sz'] 创建当前选定对象的列表 myList=cmds.lssl=True 锁定选定对象的“平移”属性 def attrLockT*参数: checkAttr=cmds.getAttr myList[0]+sat 如果checkAttr==0: cmds.setAttrmyList[0]+sat,锁=1 删除已打开的窗口 如果cmds.window'animationCtrl',exists=True: cmds.deleteUI'animationCtrl',window=True 设置窗口 cmds.window “animationCtrl”, title=动画控件, 宽度高度=300500, s=假 form=cmds.formLayout tabs=cmds.tablayoutinermarginwidth=5,innerMarginHeight=5 cmds.formLayout 类型 编辑=真, 附件= 选项卡“顶部”,0, 制表符“左”,0, 选项卡“底部”,0, 制表符“右”,0 第一个选项卡的布局 child1=cmds.gridLayout numberOfRowsColumns=4,3,cwh=100,50 cmds.textlabel= cmds.textlab=Lock,align=center,h=20,w=250 cmds.textlabel= cmds.buttonlabel=Translate,h=300,w=250,c=attrLockT cmds.buttonlabel=旋转,h=50,w=250 cmds.buttonlabel=刻度,h=50,w=250 cmds.textlabel= cmds.textlab=Unlock,align=center,h=20,w=250 cmds.textlabel= cmds.buttonlabel=Translate,h=50,w=250 cmds.buttonlabel=旋转,h=50,w=250 cmds.buttonlabel=刻度,h=50,w=250 cmds.setParent“..” 第二个选项卡的布局 child2=cmds.rowColumnLayoutnumberOfColumns=3 cmds.button cmds.button cmds.button cmds.setParent“..” cmds.tabLayout 标签, 编辑=真, tabLabel=child1,“锁定/解锁”,child2,“可设置钥匙/不可设置钥匙” cmds.showWindow'animationCtrl' 抛出的错误是

# Error: coercing to Unicode: need string or buffer, list found
# Traceback (most recent call last):
#   File "<maya console>", line 16, in attrLockT
# TypeError: coercing to Unicode: need string or buffer, list found 
这行吗

myList[0]+sat

myList[0]是列表的类型吗?因为sat变量肯定是list

如果myList只是一个字符串列表,那么myList[0]将只是string类型的一个元素,它将产生一个错误

简化您的程序,只需留下锁定例程和带有按钮的窗口,以查看将发生什么,确保将对象+属性的正确名称传递给getAttr-就像“obj.attrib”一样的字符串

为您的函数提供一些特定于python的线索

如果需要对两个列表求和:

例如,这将导致['obj1.tx','obj2.ty','obj3.tz']

如果需要将属性列表应用于对象:

[myList[0]+a代表sat中的a] 这将导致['obj1.tx','obj1.ty','obj1.tz']

如果需要将相同的属性列表应用于所有对象:

[sat中attName的myList中objName的objName+attName] 将导致['obj1.tx','obj1.ty','obj1.tz','obj2.tx',…,'obj3.tz']

然后,您可以通过该结果列表调用锁定函数:

def lockera: checkAttr=cmds.getAttra 如果checkAttr==0: cmds.setAttra,锁=1 最后,它应该看起来:

def attrLockT*参数: atrlist=[…] 对于目录中的列表: 洛克拉 两个问题:

首先,要循环遍历各个属性,并将它们与对象名称连接起来:

def lockTranslate(*args):
    for obj in mylist:
        for attr in ['.tx', '.ty', '.tz']: 
            cmds.setAttr(obj + "." + attr, l=True)
第二,也许更重要的是,你可能会在你的职能范围内遇到问题。在您键入的表单中,函数可以通过访问myList和sat等变量-如果您在侦听器中执行所有这些,它将起作用,但是如果您打破了闭包,如果这进入了一个被另一个函数调用的函数,那么事情就不起作用了——myList将被卡住,指向定义该函数时选择的任何内容

在这种特殊情况下,您可能希望只对选择进行操作,而不是继承myList:

def lockTranslate(*args):
    for obj in cmds.ls(sl=True, type = 'transform'):
        for attr in ['.tx', '.ty', '.tz']: 
            cmds.setAttr(obj + "." + attr, l=True)

哦,梅尔。。您在代码中的错误点在哪里?它实际上说的是什么问题是sat是一个列表,而mylist[0]是一个字符串,因此您无法添加它们。你想一次一个循环通过sat和字符串到myList[0],锁定每个属性不,我把它改为sat[0],一直到2,它不再给出错误,但是,它不执行我希望它执行的功能,你知道如何修复它吗?我想做的是在maya中为选定对象创建一个锁定属性的按钮。我尝试了您建议的使用[objName+attName for objName for objName in myList for attName in sat]的方法。但是,这只会锁定列表中第一个对象的平移Y,所以我有点困惑了:谢谢你的帮助though@luke尝试监督发生的情况,即在def loockera body中放置print a以查看锁定的属性,并将print checkAttr放在cmds.getAt之后 看看它会返回什么
def lockTranslate(*args):
    for obj in cmds.ls(sl=True, type = 'transform'):
        for attr in ['.tx', '.ty', '.tz']: 
            cmds.setAttr(obj + "." + attr, l=True)