【问题标题】:How do I use Def Function strings in maya如何在 Maya 中使用 Def 函数字符串
【发布时间】:2014-11-19 05:22:38
【问题描述】:

我一直在从 mel 转置,想知道是否有人可以用这个为我指明正确的方向。 我不太确定如何在考虑到特定参数的情况下运行函数。

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

任何建议都会很棒! 谢谢

【问题讨论】:

    标签: python string maya function


    【解决方案1】:

    乍一看,我相信您的问题是您的 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

    【讨论】:

      【解决方案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 命令。没有它,您的控件将相互叠加

      【讨论】:

        【解决方案3】:

        使用 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()
        

        【讨论】:

        • 局部优于 Lambda
        猜你喜欢
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        • 2021-05-07
        • 2012-05-18
        • 2012-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多