Передать имя экземпляра в качестве аргумента от нескольких элементов управления пользовательским интерфейсом одной функции в Python-Maya - PullRequest
0 голосов
/ 08 сентября 2018

Я разрабатываю пользовательский интерфейс на python для Maya и пытаюсь создать функцию, которая выполняет действие при расширении 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 голосов
/ 08 сентября 2018

В настоящее время у вас есть что-то подобное:

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)
...