如何在maya中使用Def函数字符串

时间:2014-09-24 16:07:04

标签: python string maya function

我一直在改变梅尔,并且想知道是否有人能指出我正确的方向。 我不太确定如何运行具有特定arg的函数。

def testFUNCTION(field):
    if field == 'option1': print 'You have selected option 1'
    else: print 'You have selected option 2'

mc.window( w=150 )
mc.textFieldButtonGrp (l='option 1', bl='Set', ad3=2, bc=('testFUNCTION, option1'))
mc.textFieldButtonGrp (l='option 2', bl='Set', ad3=2, bc=('testFUNCTION, option2'))
mc.showWindow()

我一直在:

line 1: name 'option1' is not defined

任何建议都会很棒! 感谢

3 个答案:

答案 0 :(得分:2)

您尝试在传递

时从字符串创建回调
mc.textFieldButtonGrp (l='option 1', bl='Set', ad3=2, bc=('testFUNCTION, option1')

当Maya评估字符串时,' option1'没有引用,所以Python认为它是一个变量名。

一般而言,您不希望将字符串格式用于回调,正是出于这个原因:确定变量定义的位置会有问题。

通常的解决方法是使用functools模块或lambda来创建回调,这些回调具有创建时所需的所有信息。例如:

def testFUNCTION(field):
    if field == 'option1': print 'You have selected option 1'
    else: print 'You have selected option 2'

window = mc.window( w=150 )
mc.columnLayout()
mc.textFieldButtonGrp (l='option 1', bl='Set', ad3=2, bc=(lambda : testFunction('option1'))
mc.textFieldButtonGrp (l='option 2', bl='Set', ad3=2, bc=(lambda : testFunction('option2'))
mc.showWindow(window)

有关如何轻松设置回调的详细说明here

PS:注意添加了columnLayout命令。如果没有它,你的控制将在彼此之上展开

答案 1 :(得分:2)

使用functools在maya UI中传递参数:

command = partial(defName,arg01,arg02)#您需要的任何参数

from functools import partial

def testFUNCTION(field, *args):
    if field == 'option1': print 'You have selected option 1'
    else: print 'You have selected option 2'

mc.window( w=150 )
mc.textFieldButtonGrp (l='option 1', bl='Set', ad3=2, bc=partial(testFUNCTION, 'option1'))
mc.textFieldButtonGrp (l='option 2', bl='Set', ad3=2, bc=partial(testFUNCTION, 'option2'))
mc.showWindow()

答案 2 :(得分:0)

乍一看,我相信你的问题是你的bc(buttonCommand)标志需要是一个函数。对于一个班轮函数,您可以使用lambda

mc.textFieldButtonGrp (l='option 1', bl='Set', ad3=2, bc=lambda x='option1': testFUNCTION(x))

然而,总的来说,我建议一起重新评估所有并远离maya cmds并使用pymel。

也许这样的事情可以满足你的需求。

results = pm.confirmDialog(title='Title', message='Here is an example', button=['option1', 'option2'])
testFUNCTION(result)

如果您需要更强大的GUI,请考虑尝试使用PySide