Передайте имя экземпляра в качестве аргумента из нескольких элементов управления пользовательского интерфейса в одну функцию в Python-Maya.

Я разрабатываю пользовательский интерфейс на 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 # 

person Alejandro Cabrera    schedule 08.09.2018    source источник


Ответы (1)


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

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)
person Laurent LAPORTE    schedule 08.09.2018