【问题标题】:running a method within another method. python在另一个方法中运行一个方法。 Python
【发布时间】:2009-12-07 21:17:48
【问题描述】:

我在另一个方法中调用一个方法。我得到的这个脚本的错误是

NameError: name 'mnDialog' is not defined

有什么原因吗?我认为这与执行不在全局级别的命令有关。 (我不认为 python 有一个全局和局部变量声明。)什么是正确的语法或绕过这个? 谢谢你的时间。


import maya.cmds as cmds
def mnProgRun():
    def mnDialog(*args):
        cmds.confirmDialog( title='Confirm', message='Are you sure?',button=['Yes','No'], defaultButton='Yes',cancelButton='No',dismissString='No' )
    def mnMakeWin():
        cmds.window( 'mnWin', title = 'testman', wh=(260,100))
        cmds.columnLayout(adjustableColumn=False, columnAlign='center')
        cmds.button( label="Yes,it works",align='center',width=120,height=25, backgroundColor=[0.5,1,0.5],command='cmds.scriptJob( event=["SelectionChanged","mnDialog"])')
        cmds.button( label="No, Thank You!",align='center',width=120,height=25, backgroundColor=[1,0.5,0.5],command='cmds.deleteUI("mnWin")')
    cmds.showWindow( 'mnWin' )
    mnMakeWin()
mnProgRun()

【问题讨论】:

    标签: python methods command maya


    【解决方案1】:

    问题是mnDialog 没有从mnMakeWin 中查找,您正在传递名称,稍后当您不在正确的范围内时会查找它。

    传递函数而不是名称可能会起作用。我没有安装maya,所以无法尝试。

    否则,您将不得不在全局范围内定义 mnDialog,这对我来说似乎是一个奇怪的限制

    【讨论】:

    • 感谢回复,能否举个简单的小例子,传递一个函数而不是一个名字,也许有一个打印“hello”的例子。
    【解决方案2】:

    mnDialogmnProgRun 中的局部变量。它在函数范围之外是不可访问的。如果您想要它,请在适当的范围内定义它。

    (我没有觉得python有全局和局部变量声明。)

    你有错误的印象。

    【讨论】:

    • 感谢您的回复,我一直在学习新东西
    【解决方案3】:

    您应该在顶层定义mnDialog。它不在正确的命名空间中。

    此外,在 Python 中嵌套函数(几乎)总是不必要地复杂化。

    【讨论】:

    • 将它嵌套在大方法中是有原因的。因此,maya 可以在启动时将其作为一种大方法调用和获取,在外部定义将导致它不在第一个位置获取它。有办法解决这个问题吗?
    【解决方案4】:

    maya 总是对勺子有问题, 您可以在函数外部定义 mnDialog() 和 mnMakeWin() ,在顶级瓢级别, 它的 Maya 问题不是来自 python,因为我在从 maya ui 命令(例如按钮事件)调用类方法时遇到了问题。

    希望对你有帮助:)

    ##编辑

    将 maya.cmds 导入为 cmds

    def mnDialog(*args):
    
        cmds.confirmDialog( title='Confirm', message='Are you sure?',button=['Yes','No'],
    
                              defaultButton='Yes',cancelButton='No',dismissString='No' )
    
    def mnMakeWin():
    
        cmds.window( 'mnWin', title = 'testman', wh=(260,100))
    
        cmds.columnLayout(adjustableColumn=False, columnAlign='center')
    
        cmds.button( label="Yes,it works",align='center',width=120,height=25, 
                     backgroundColor=[0.5,1,0.5],command='cmds.scriptJob( event=
                       ["SelectionChanged","mnDialog"])')
    
        cmds.button( label="No, Thank You!",align='center',width=120,height=25, 
                    backgroundColor=[1,0.5,0.5],command='cmds.deleteUI("mnWin")')
    
        cmds.showWindow( 'mnWin' )
    

    定义 mnProgRun():

        mnMakeWin()
    

    #运行

    mnProgRun()

    【讨论】:

    • 有没有办法仍然执行 python 脚本,因为我在 usersetup.mel 中采购它。
    • 是的.. 如前所述,将您的功能移动到顶级勺子级别(模块级别),然后尝试获取它们,就像我的编辑一样
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    相关资源
    最近更新 更多