Python- class 实例问题(init 有五个参数;只传递两个)
Python- class instance problem (init takes five arguments; only passing two)
我一直在研究一个 IK/FK 联合匹配脚本,上个月我终于能够正常工作了。今天启动 Maya,运行 脚本,当界面加载时,我收到以下错误…
运行正在加载脚本:
# Error: NameError: file <maya console> line 196: global name 'Fks' is not defined #
点击我的“select根关节链”按钮后的这个:
# Error: NameError: file <maya console> line 1: name 'select_joints_afk' is not defined #
我对这个很陌生所以我真的不明白到底是怎么回事
class Create_Selection_Chains(object):
def __init__(self, name, *args):
self.Fks = Fks
self.Ikw = Ikw
self.Pv = ikpv
self.name = name
self.combined_selection = self.Fks+self.Ikw+self.Pv
print("List created"+self.name)
def select_joints_afk(self):
if cmds.ls(selection = True,type=("transform",'nurbsCurve')):
sel = cmds.ls(sl=True)
fks = sel
fkCtrls = cmds.listRelatives(sel, allDescendents=True, type=("transform",'nurbsCurve'))
Fks = [nurbsCurve for nurbsCurve in fkCtrls if nurbsCurve.startswith('FK') & nurbsCurve.endswith('Ctrl')]
cmds.textFieldButtonGrp(gtF0, edit = True, tx ='' .join(sel),buttonLabel='IK OK',backgroundColor = (.5,.8,.2))
del Fks[1]
del Fks[2]
Fks.extend(sel)
print Fks
return self.Fks
else:
text = cmds.confirmDialog( title='Error', message='Must select joint', button=['OK'],
defaultButton='Ok', dismissString='No' )
def select_joints_aikw(self):
if cmds.ls(selection = True,type=("transform",'nurbsCurve')):
sel=cmds.ls(selection = True)
ikwrist = sel
Ikw = [nurbsCurve for nurbsCurve in ikwrist if nurbsCurve.startswith('IK') & nurbsCurve.endswith('Ctrl')]
cmds.textFieldButtonGrp(gtF1, edit = True, tx ='' .join(ikwrist),buttonLabel='IK OK',backgroundColor = (.5,.8,.2))
cmds.select(ikwrist)
print Ikw
return self.ikw
else:
text = cmds.confirmDialog( title='Error', message='Must select joint', button=['OK'], defaultButton='Ok',
dismissString='No' )
def select_joints_ikpv(self):
if cmds.ls(selection = True,type=("transform",'nurbsCurve')):
sel = cmds.ls(sl=True)
ikPvsel = sel
ikpv = [nurbsCurve for nurbsCurve in ikPvsel if nurbsCurve.startswith('IK') & nurbsCurve.endswith('Ctrl')]
cmds.textFieldButtonGrp(gtF2, edit = True, tx ='' .join(ikPvsel),buttonLabel='IK OK',backgroundColor = (.5,.8,.2))
cmds.select(ikPvsel)
print ikpv
return self.ikpv
else:
text = cmds.confirmDialog( title='Error', message='Must select joint', button=['OK'],
defaultButton='Ok', dismissString='No' )
有人告诉我,如果我在实例化它时将变量传递给 class,只要我传递所需的参数,它应该 运行 没问题,但是在更改
def __init__(self, name, *args):
到
def __init__(self, name, Fks, Ikw, ikpv):
我在 Maya 中加载我的脚本时收到以下消息
# Error: TypeError: file <maya console> line 413: __init__() takes at least 5 arguments (2 given) #
第 413 行是我加载实例的地方...:[=19=]
left_arm_select = Create_Selection_Chains("left arm")
有人可以帮助我了解正在发生的事情吗?因为我以为我在传递我所有的论点
简而言之,调用 Create_Selection_Chains(...)
现在还需要三个参数。为什么?
__init__(self, name, Fks, Ikw, ikpv)
需要几个 位置参数 ,即 name, Fks, Ikw, ikpv
__init__(self, name, *args):
需要一个 positional argument (name
) and 0 to many arbitrary arguments (*args
)。
解决方案:在实例化时传入更多值,例如Create_Selection_Chains("left arm", "foo", "bar", "baz")
给定
class Create_Selection_Chains(object):
def __init__(self, name, *args):
self.Fks = Fks
self.Ikw = Ikw
self.Pv = ikpv
self.name = name
...
您可能已经发现,__init__(self, name, *args)
不起作用,因为 args
未映射到任何内容,并且 Fks
、Ikw
和 ikpv
没有定义。这将引发错误。
代码
考虑以下作为众多选项之一:
class Create_Selection_Chains:
def __init__(self, name, fks, ikw, ikpv):
self.name = name
self.fks = fks
self.ikw = ikw
self.pv = ikpv
...
最后,在实例化时传入更多的值,例如:
left_arm_select = Create_Selection_Chains("left arm", "foo", "bar", "baz")
*args 是可变的,您的更改不是。
在这里你必须给出你在 init 函数中定义的每个参数。
您可以将其更改为 Fks=some value、IKw=some value 等,使其成为可选参数。
我一直在研究一个 IK/FK 联合匹配脚本,上个月我终于能够正常工作了。今天启动 Maya,运行 脚本,当界面加载时,我收到以下错误…
运行正在加载脚本:
# Error: NameError: file <maya console> line 196: global name 'Fks' is not defined #
点击我的“select根关节链”按钮后的这个:
# Error: NameError: file <maya console> line 1: name 'select_joints_afk' is not defined #
我对这个很陌生所以我真的不明白到底是怎么回事
class Create_Selection_Chains(object):
def __init__(self, name, *args):
self.Fks = Fks
self.Ikw = Ikw
self.Pv = ikpv
self.name = name
self.combined_selection = self.Fks+self.Ikw+self.Pv
print("List created"+self.name)
def select_joints_afk(self):
if cmds.ls(selection = True,type=("transform",'nurbsCurve')):
sel = cmds.ls(sl=True)
fks = sel
fkCtrls = cmds.listRelatives(sel, allDescendents=True, type=("transform",'nurbsCurve'))
Fks = [nurbsCurve for nurbsCurve in fkCtrls if nurbsCurve.startswith('FK') & nurbsCurve.endswith('Ctrl')]
cmds.textFieldButtonGrp(gtF0, edit = True, tx ='' .join(sel),buttonLabel='IK OK',backgroundColor = (.5,.8,.2))
del Fks[1]
del Fks[2]
Fks.extend(sel)
print Fks
return self.Fks
else:
text = cmds.confirmDialog( title='Error', message='Must select joint', button=['OK'],
defaultButton='Ok', dismissString='No' )
def select_joints_aikw(self):
if cmds.ls(selection = True,type=("transform",'nurbsCurve')):
sel=cmds.ls(selection = True)
ikwrist = sel
Ikw = [nurbsCurve for nurbsCurve in ikwrist if nurbsCurve.startswith('IK') & nurbsCurve.endswith('Ctrl')]
cmds.textFieldButtonGrp(gtF1, edit = True, tx ='' .join(ikwrist),buttonLabel='IK OK',backgroundColor = (.5,.8,.2))
cmds.select(ikwrist)
print Ikw
return self.ikw
else:
text = cmds.confirmDialog( title='Error', message='Must select joint', button=['OK'], defaultButton='Ok',
dismissString='No' )
def select_joints_ikpv(self):
if cmds.ls(selection = True,type=("transform",'nurbsCurve')):
sel = cmds.ls(sl=True)
ikPvsel = sel
ikpv = [nurbsCurve for nurbsCurve in ikPvsel if nurbsCurve.startswith('IK') & nurbsCurve.endswith('Ctrl')]
cmds.textFieldButtonGrp(gtF2, edit = True, tx ='' .join(ikPvsel),buttonLabel='IK OK',backgroundColor = (.5,.8,.2))
cmds.select(ikPvsel)
print ikpv
return self.ikpv
else:
text = cmds.confirmDialog( title='Error', message='Must select joint', button=['OK'],
defaultButton='Ok', dismissString='No' )
有人告诉我,如果我在实例化它时将变量传递给 class,只要我传递所需的参数,它应该 运行 没问题,但是在更改
def __init__(self, name, *args):
到
def __init__(self, name, Fks, Ikw, ikpv):
我在 Maya 中加载我的脚本时收到以下消息
# Error: TypeError: file <maya console> line 413: __init__() takes at least 5 arguments (2 given) #
第 413 行是我加载实例的地方...:[=19=]
left_arm_select = Create_Selection_Chains("left arm")
有人可以帮助我了解正在发生的事情吗?因为我以为我在传递我所有的论点
简而言之,调用 Create_Selection_Chains(...)
现在还需要三个参数。为什么?
__init__(self, name, Fks, Ikw, ikpv)
需要几个 位置参数 ,即name, Fks, Ikw, ikpv
__init__(self, name, *args):
需要一个 positional argument (name
) and 0 to many arbitrary arguments (*args
)。
解决方案:在实例化时传入更多值,例如Create_Selection_Chains("left arm", "foo", "bar", "baz")
给定
class Create_Selection_Chains(object):
def __init__(self, name, *args):
self.Fks = Fks
self.Ikw = Ikw
self.Pv = ikpv
self.name = name
...
您可能已经发现,__init__(self, name, *args)
不起作用,因为 args
未映射到任何内容,并且 Fks
、Ikw
和 ikpv
没有定义。这将引发错误。
代码
考虑以下作为众多选项之一:
class Create_Selection_Chains:
def __init__(self, name, fks, ikw, ikpv):
self.name = name
self.fks = fks
self.ikw = ikw
self.pv = ikpv
...
最后,在实例化时传入更多的值,例如:
left_arm_select = Create_Selection_Chains("left arm", "foo", "bar", "baz")
*args 是可变的,您的更改不是。 在这里你必须给出你在 init 函数中定义的每个参数。 您可以将其更改为 Fks=some value、IKw=some value 等,使其成为可选参数。