用于前缀替换的Textfield查询

时间:2014-05-07 13:48:07

标签: python user-interface textfield maya python-2.6

我忙于在我的索具工具中创建一个功能,它允许镜像关节并替换前缀。关节的镜像(行为和方向)正在起作用,但是当我search and replace我的两个文本字段中的内容时,我收到错误。场景中关节的前缀是R_L_,我想用它替换它们。

错误如下:NameError:未定义名称searchFor。这里奇怪的部分是我实际上创建了一个名为searchFor的变量和一个名为replaceWith的变量。请参阅以下代码:

import maya.cmds as cmds 

child2 = cmds.gridLayout( cw = self.size[ 0 ] / 2 - 10, nc = 2 )
cmds.text( l = ' Mirror Joints', al = 'left', font = "boldLabelFont" ) 
cmds.separator( style = 'none' )
searchFor = cmds.textFieldGrp( tx = 'Search for...' )
replaceWith = cmds.textFieldGrp( tx = 'Replace with...' )  

cmds.button( label = 'Mirror Orientation',
             command = "cmds.mirrorJoint( cmds.ls( sl = True ), 
             mirrorYZ = True, 
             mirrorBehavior = False, 
             searchReplace = cmds.textFieldGrp( searchFor, q = True, tx = True),
             cmds.textFieldGrp( replaceWith, q = True, tx = True )" ) 

cmds.button( label = 'Mirror Behaviour',
             command = "cmds.mirrorJoint( cmds.ls ( sl = True ), 
             mirrorYZ = True, 
             mirrorBehavior = True )" ) 

代码是UI的一部分,其他函数从另一个模块调出。难道我需要在UI模块中创建一个包含mirrorJoint命令的函数吗?或者这是一种可行的方法吗?

为了更好地查看代码: https://dl.dropboxusercontent.com/u/545575/python.zip

2 个答案:

答案 0 :(得分:0)

是的,你需要一个功能。只有当引用的所有对象都在全局空间中时才会使命令成为字符串(不建议这样做,因此也不建议使用扩展字符串命令)

创建函数的最简单方法是使用lambda:

cmds.button(   
    label='Mirror Orientation',
    command=lambda *_: cmds.mirrorJoint(cmds.ls (sl=True), mirrorYZ=True, mirrorBehavior=False, searchReplace=(cmds.textFieldGrp(searchFor, q=True, tx=True),cmds.textFieldGrp(replaceWith, q=True, tx=True)))
)

Lambda创建一个未命名的函数,*_允许任意数量的一次性参数。调用时,它会调用先前在字符串命令中的cmds.mirrorJoint

答案 1 :(得分:0)

您正在使用字符串来调用该函数,并且该字符串在全局范围内被解释 - 就像您在侦听器中键入它一样;在你的函数体外,'searchFor'不存在。

以下是关于maya如何看待回调命令的参考:http://techartsurvival.blogspot.com/2014/04/maya-callbacks-cheat-sheet.html

MHLester的例子会做你想要的,你必须注意闭包。 lambda将从定义它的范围继承变量 - 但是当范围关闭时,不是在它定义的时候;这可能会引起一些惊喜。例如,如果你试过这个:

def test():
    w = cmds.window()
    cmds.columnLayout()    
    example = 1
    cmds.button("test", c= lambda *_:  sys.stdout.write( "example: %i" % example ) )
    example = 4
    cmds.showWindow(w)

点击按钮会打印'4',即使它看起来应该是'1'。