【问题标题】:Textfield query for prefix replacing前缀替换的文本字段查询
【发布时间】:2014-05-07 13:48:06
【问题描述】:

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

错误如下: NameError: name searchFor is not defined。奇怪的是,我实际上创建了一个名为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

【问题讨论】:

  • 如果您标记您的问题 python,您将获得比 python-2.6 更多的视图,因为 python 有关注该标记的订阅者。我已经编辑了这篇文章以包含它

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


【解决方案1】:

您正在使用一个字符串来调用该函数,并且该字符串在全局范围内被解释 - 就像您在侦听器中键入它一样;在你的函数体之外,'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”。

【讨论】:

    【解决方案2】:

    是的,你需要一个函数。仅当引用的所有对象都在全局空间中时,才使命令成为字符串有效(不鼓励这样做,因此也不鼓励通过扩展字符串命令)

    创建函数的最简单方法是使用 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

    【讨论】:

      猜你喜欢
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 2019-09-15
      • 2011-06-17
      • 1970-01-01
      • 2016-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多