首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python,函数调用2个函数,强制运行这两个函数

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

Stack Overflow用户
提问于 2016-05-24 13:43:56
回答 2查看 315关注 0票数 0

我用一个按钮创建了一个windowUI来运行2个函数,所以我定义了一个新函数来运行另外的2个函数。

代码语言:javascript
复制
def addSlider_splitLoop():
    addSlider()
    splitLoop()

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

当按下按钮时,只有一个函数工作:

  • 当未选择任何内容时,该命令只运行addSlider()函数,
  • 当选择多边形循环时,命令只运行splitLoop()函数

这实际上是有意义的,但对我没有帮助,改变函数的顺序也没有帮助。

我想强迫它运行这两个函数,我如何做到这一点?

实际上,最好的办法是让addSlider()只在splitLoop()工作时才能运行,但我是真正的初学者,我不知道怎么做.强制运行这两个函数可能是一个肮脏的解决方案,但目前对我来说已经足够了。

这是完整的代码(组合键只用于测试)

代码语言:javascript
复制
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()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-24 23:44:08

这里发生了几件事。

  1. 不要将脚本称为字符串--这是今后变得更加粗放的秘诀。相反,传递函数对象,如@Dr.Weeny的示例中所示。它更可靠,实际上也更快。更多在这里
  2. 在您发布的代码中,addSlider()不做任何工作来获取当前活动的GUI对象--取决于它运行的时间、滑块可能出现在任何地方--在频道框中、在其他窗口中,或者它可能失败。这可能是函数似乎没有运行的原因:您只是没有发现新的滑块在最后的位置。尝试添加调试打印。
  3. 如果您想在其他命令之后运行addSlider(),最简单的方法可能是让所有工具命令返回一个值,指示它们已经成功或失败: def splitLoop():mc.ConvertSelectionToContainedEdges() mc.polySplitRing(sma = 180,wt = 0.5)返回mc.polyDuplicateEdge(ch = True,of = loopDistance() ),但返回None def addSlider_splitLoop():if splitLoop():addSlider()
票数 1
EN

Stack Overflow用户

发布于 2016-05-24 16:24:05

您不应该在函数命令中添加逗号。您可以尝试使用mc.evalDeferred(‘addSlider()\n nsplitLoop()’)。您可以使用try:除了:最后:

由于我无法测试您的脚本,因此很难确定您的两个功能都应该做些什么。在我看来,这是一个空闲时间的问题,您应该为evalDeferred命令而绞尽脑汁。

代码语言:javascript
复制
   def addSlider_splitLoop():
        addSlider()
        splitLoop()

    mc.button(label ='Combo' , command = addSlider_splitLoop)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37415490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档