Use Partial To Query UI Control

from functools import partial

def foo(a, arg=None):
print ‘first’,a
print ‘2nd’,arg
b= partial(foo, ‘default’)
#first default
#2nd None
#first default
#2nd addon
#<functools.partial object at 0x74c60>

Partial is a way to pack a func with a preset argument.  In the example above, calling b() has the same effect of calling foo(‘default’), and calling b(‘addon’) equals foo(‘default’, ‘addon’). This is quite useful when you want to query values from UI controls in Maya. For example:

import maya.cmds as cmds
from functools import partial
def foo(inst=None, arg=None):
retrieved = cmds.floatSliderGrp(inst.aSlider, query=True, value=True)
# omitted do something with retrieved

class Bar(object):
def __init__(self):
# omitted ui setup
self.aSlider = cmds.floatSliderGrp( label=’foo value’, v=0.5, min=0, max=1, cc=partial(foo, self) )
# omitted ui setup

So aSlider is a slider control as a member of Bar, with its change command assigned to function foo(). Need to expose the control to foo(), so the value can be queried for use. Since cc flag must be assigned to a function object, cc = foo(self) cannot work. Partial packed foo(self) into an object and solved this problem.


Leave a comment

Filed under Maya API, Python

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s