python maya,函数调用 2 个函数,强制 运行 两个

python maya, function call 2 functions, force to run both

我制作了一个带有按钮的 windowUI 运行 2 个函数,所以我为 运行 其他 2

定义了一个新函数
def addSlider_splitLoop():
    addSlider()
    splitLoop()

mc.button(label ='Combo' , command = 'addSlider_splitLoop()' )

按下按钮时,只有 1 个功能起作用:

这实际上是有道理的,但对我没有帮助,更改函数的顺序也没有帮助

我想强制它 运行 这两个功能,我该怎么做?

实际上最好的办法是只有当 splitLoop() 工作时才将 addSlider() 设置为 运行,但我是一个真正的初学者,我不知道如何做到这一点......强制 运行 这两个功能可能是一个肮脏的解决方案,但目前对我来说已经足够了

这是完整的代码(组合按钮仅用于测试)

import maya.cmds as mc

def addSlider_splitLoop():
        addSlider()
        splitLoop()    




def addSlider():
        mc.floatSliderGrp( minValue = 1.00 , maxValue = 99.00 , value = 50.00 , field = True )

def splitLoop():    
        mc.ConvertSelectionToContainedEdges()
        mc.polySplitRing(sma = 180 , wt = 0.5)
        mc.polyDuplicateEdge(ch = True , of = loopDistance() )
        #addSlider()




def doubleLoop():
        mc.ConvertSelectionToContainedEdges()
        mc.polySplitRing(sma = 180 , wt = 0.5)
        mc.polyDuplicateEdge(ch = True , of = loopDistance() )
        mc.polyDelEdge(e = False, cv = True,)
        #addSlider()

def loopDistance():
        distance =  mc.floatSliderGrp('LoopDistanceValue' , query = True, value = True)
        convertedDistance = distance / 100
        return convertedDistance    



def splitLoopUI():

        if mc.window('splitLoopUI' , exists = True):
            mc.deleteUI('splitLoopUI')

        mc.window('splitLoopUI')

        mc.frameLayout( label='                            set loop distance')
        mc.floatSliderGrp('LoopDistanceValue' , minValue = 1.00 , maxValue = 99.00 , value = 50.00 , field = True )    

        mc.button(label ='Triple Loop' , command = 'splitLoop()' ) 
        mc.button(label ='Double Loop' , command = 'doubleLoop()' )
        mc.button(label ='Combo' , command = 'addSlider_splitLoop()' )

        mc.text( label=' +   edit loop distance   + ')

        mc.scrollLayout( 'scrollLayout' )
        mc.columnLayout( adjustableColumn=True )


        mc.showWindow('splitLoopUI')
splitLoopUI()

你不应该在你的函数命令上加上逗号。 您可以尝试使用 mc.evalDeferred('addSlider()\nsplitLoop()')。 你可以使用 try: except: finally:

由于我无法测试您的脚本,所以很难确定您的两个函数应该用什么来完成。在我看来,这是一个空闲时间的问题,你应该挠头研究evalDeferred命令。

   def addSlider_splitLoop():
        addSlider()
        splitLoop()

    mc.button(label ='Combo' , command = addSlider_splitLoop)

这里发生了几件事。

  1. 不要将脚本称为字符串——这会导致日后变得奇怪。而是传递函数对象,如@Dr.Weeny 的示例所示。它更可靠,实际上也更快。 More here
  2. 在您发布的代码中 addSlider() 没有做任何工作来获取当前活动的 GUI 对象 -- 取决于它 运行 滑块何时可以出现在任何地方 -- 在通道盒,在其他 window 中,否则它可能会失败。这可能就是为什么这个功能看起来不是 运行ning 的原因:你只是没有在新滑块结束时发现它。尝试添加调试打印。
  3. 如果你想 运行 addSlider() 在其他命令之后,最简单的做法可能是让所有工具命令 return 一个值指示他们成功或失败:

    def splitLoop():    
        try:
            mc.ConvertSelectionToContainedEdges()
            mc.polySplitRing(sma = 180 , wt = 0.5)
            return mc.polyDuplicateEdge(ch = True , of = loopDistance() )
         except:
             return None
    
    def addSlider_splitLoop():
        if splitLoop():
            addSlider()