Maya中的Python - 查询复选框值

时间:2013-09-30 16:33:01

标签: python user-interface checkbox maya

我是python的新手,我正在进行这个小小的业余时间项目。 我无法找到解决以下问题的方法:

我设置了这样一个GUI:

flWin = mc.window(title="Foot Locker", wh=(210,85))
mc.columnLayout()
mc.text(label='Frame Range')
rangeField = mc.intFieldGrp(numberOfFields=2,value1=0, value2=0)
mc.rowColumnLayout(numberOfRows=2)
translateBox = mc.checkBox(label='Translation',value=True)
mc.button(label="Bake it!", w=60, command="Bake()")
rotateBox = mc.checkBox(label='Rotation',value=True)
mc.button(label='Key it!', w=60, command='Key()')
scaleBox = mc.checkBox(label='Scale')
mc.showWindow(flWin)

然后在函数'Bake'中 我喜欢查询复选框以执行不同的操作,具体取决于选中的方框...如下所示:

    translateValue = mc.checkBox(translateBox, query=True)
    rotateValue = mc.checkBox(rotateBox, query=True)
    scaleValue = mc.checkBox(scaleBox, query=True)

    if scaleValue = True:          
        if rotateValue = True:     
            if translateValue = True:
                mc.parentConstraint ('LockCator', Selection, n='LockCatorConstraint')
                mc.scaleConstraint('LockCator', Selection, n='selectionScale')

            else:
               mc.parentConstraint ('LockCator', Selection, n='LockCatorConstraint', skipTranslate=True) 
               mc.scaleConstraint('LockCator', Selection, n='selectionScale')


bla bla bla... you get the trick...

当我尝试运行脚本时,我收到一条错误消息,指出行if scaleValue = True:

上的语法无效

我也试过用这个:

mc.attributeQuery(translateBox,value=True) 

但这给了我一个错误,说“价值”是一个无效的旗帜......我不知道这意味着什么。

这里的一些帮助将不胜感激!! 谢谢你们!

2 个答案:

答案 0 :(得分:3)

你很接近,查询标志只是告诉你要获取数据的命令,而不是设置,无论你正在进行什么操作,还必须出现在同一个命令中,你只是错过了{{1} }字段的标志。

v=True

此外,在您链接if命令时,看到您的值只能是真或假,您只需编写translateValue = mc.checkBox(translateBox, query=True, value=True) rotateValue = mc.checkBox(rotateBox, query=True, value=True) scaleValue = mc.checkBox(scaleBox, query=True, value=True) ,这与写if (scaleValue):

相同
if scaleValue == True:

更好的是,看到你对这些链做的基本相同的事情,我们可以简化这个:

if (scaleValue):
    if (rotateValue):     
        if (translateValue):
            mc.parentConstraint ('LockCator', Selection, n='LockCatorConstraint')
            mc.scaleConstraint('LockCator', Selection, n='selectionScale')
        else:
            mc.parentConstraint ('LockCator', Selection, n='LockCatorConstraint', skipTranslate=True) 
            mc.scaleConstraint('LockCator', Selection, n='selectionScale')

以上内容与此代码上方的代码完全相同。

希望这有帮助,正如@jonathon所提供的那样,你编写UI的方式可能会变得非常混乱和难以阅读,绝对读入QT Designer,这是一个精彩的程序。

答案 1 :(得分:0)

如果我正确理解您的问题,您需要做的就是包含queryvalue标志,例如:

import maya.cmds as mc

flWin = mc.window(title="Foot Locker", wh=(210,85))
mc.columnLayout()
mc.text(label='Frame Range')
rangeField = mc.intFieldGrp(numberOfFields=2,value1=0, value2=0)
mc.rowColumnLayout(numberOfRows=2)
translateBox = mc.checkBox(label='Translation',value=True)
mc.button(label="Bake it!", w=60, command="Bake()")
rotateBox = mc.checkBox(label='Rotation',value=True)
mc.button(label='Key it!', w=60, command='Key()')
scaleBox = mc.checkBox(label='Scale')
mc.showWindow(flWin)

print mc.checkBox(scaleBox, q=True, v=True)

返回True

在查询UI元素时,您需要将命令置于查询模式,然后还提供要查询的值,在本例中为值。所以那里的所有元素都不在同一时间!

我知道这种行为很奇怪但是当你理解MEL及其等效命令如何工作时,它会更有意义。

另外,如果我没记错的话,你现在可以在Maya python中使用PySide(一个python Qt Library),这对于以编程方式创建一个ui来说听起来更好。如果您正在使用更简单的方法来创建maya ui,那么您也可以使用Qt Designer构建一个可以在运行时加载的.ui文件。

例如,从ui文件创建一个窗口:

# first delete window if it already exists
if (cmds.window('window_name', exists=True)):
    cmds.deleteUI('window_name')
window = cmds.loadUI('my_window.ui'))
cmds.showWindow(window)

要查询ui,请确保在Qt Designer中为ui元素指定唯一的名称,然后查询它们,就像您到目前为止一样。

有关使用Qt Designer和maya的更多信息,请参阅以下页面:

http://www.creativecrash.com/maya/tutorials/scripting/mel/c/using-qt-designer-for-mel-interfaces