我是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)
但这给了我一个错误,说“价值”是一个无效的旗帜......我不知道这意味着什么。
这里的一些帮助将不胜感激!! 谢谢你们!
答案 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)
如果我正确理解您的问题,您需要做的就是包含query
和value
标志,例如:
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