将实例名称作为参数从多个UI控件传递到Python-Maya中的单个函数

时间:2018-09-08 02:44:25

标签: python maya mel pymel

我正在使用Maya的python开发UI,并且试图做一个在frameLayout展开时执行动作的函数,在这种情况下,我有多个“ frameLayout”对象,我想使用一个函数“ fl_expand”,而不是每个对象一个

def fl_expand(*args):
    print args        

with frameLayout("layout1", collapsable=True, expandCommand=fl_expand):
   ...

with frameLayout("layout2", collapsable=True, expandCommand=fl_expand):
   ...

但是我不知道如何将实例名称作为参数传递给函数,我尝试过:

with frameLayout("layout1", collapsable=True, expandCommand=fl_expand("layout1")):
   ...

但是我当然会收到此错误:

# Error: TypeError: file /usr/autodesk/maya2018/lib/python2.7/site-packages/pymel/internal/pmcmds.py line 134: Invalid arguments for flag 'ec'.  Expected string or function, got NoneType # 

1 个答案:

答案 0 :(得分:0)

当前,您有类似的东西:

def fl_expand(*args):
    print(args)

def frameLayout(name, collapsable, expandCommand):
    print("frameLayout: " + name)
    expandCommand('foo')

frameLayout("layout1", collapsable=True, expandCommand=fl_expand)

您想要的是调用 fl_expand 函数,其中第一个参数已经填充了布局的名称。为此,您可以使用partiel函数。请参阅functools.partial的文档。

您可以尝试:

import functools

frameLayout("layout1", collapsable=True, expandCommand=functools.partial(fl_expand, "layout1"))

当然,如果您有很多这样的电话,可能会很费力。您还可以定义自己的 frameLayout 函数:

def myFrameLayout(name, collapsable, expandCommand):
    cmd = functools.partial(fl_expand, name)
    return frameLayout(name, collapsable, cmd)

myFrameLayout("layout2", collapsable=True, expandCommand=fl_expand)