我已经研究了一段时间了,但是找不到有关在窗口中添加行的任何信息。我看到它是用pyside2和qt完成的,女巫可以使用,但用户使用的是Maya的多个版本(2016 = pyside,2017 = pyside2)。
我希望它像在pyside中添加小部件一样。我这样做是在添加行的功能类似于添加行1,添加行2和添加行3的情况下进行的,但是脚本变长了。我需要将rowColumnLayout
作为父项,并使其唯一,以便以后删除。另外,我必须查询每一行中的文本字段。也许是for
循环在行中添加了数字?我真的不知道,但这是我到目前为止所拥有的:
from maya import cmds
def row( ):
global fed
global info
item=cmds.optionMenu(mygroup, q=True, sl=True)
if item == 1:
cam=cmds.optionMenu(mygroup, q=True, v=True)
fed=cmds.rowColumnLayout(nc = 1)
cmds.rowLayout(nc=7)
cmds.text(l= cam )
cmds.text(l=u'Frame Range ')
start = cmds.textField('textField3')
cmds.text(l=u' to ')
finish = cmds.textField('textField2')
cmds.button(l=u'render',c='renderTedd()')
cmds.button(l=u'delete',c='deleteRow()')
cmds.setParent (fed)
def deleteRow ():
cmds.deleteUI(fed, layout=True)
if item == 2:
print item
global red
cam1=cmds.optionMenu(mygroup, q=True, v=True)
red = cmds.rowColumnLayout()
cmds.rowLayout(nc=7)
cmds.text(l= cam1 )
cmds.text(l=u'Frame Range ')
start = cmds.textField('textField3')
cmds.text(l=u' to ')
finish = cmds.textField('textField2')
cmds.button(l=u'render',c='renderTedd()')
cmds.button(l=u'delete',c='deleteRow2()')
cmds.setParent (red)
def deleteRow2 ():
cmds.deleteUI(red, control=True)
def cameraInfo():
info=cmds.optionMenu(mygroup, q=True, sl=True)
print info
def deleteRow ():
cmds.deleteUI(fed, control=True)
def getCamera():
layers=pm.ls(type="renderLayer")
for layer in layers:
pm.editRenderLayerGlobals(currentRenderLayer=layer)
cameras=pm.ls(type='camera')
for cam in cameras:
if pm.getAttr(str(cam) + ".renderable"):
relatives=pm.listRelatives(cam, parent=1)
cam=relatives[0]
cmds.menuItem(p=mygroup,label=str (cam) )
window = cmds.window()
cmds.rowColumnLayout(nr=10)
mygroup = cmds.optionMenu( label='Colors', changeCommand='cameraInfo()' )
getCamera()
cmds.button(l=u'create camera',aop=1,c='row ()')
cmds.showWindow( window )
答案 0 :(得分:1)
这完全可以用cmds.
来完成,其窍门只是构造代码,以便每行中的按钮都知道并可以在该行的小部件上进行操作;一旦可行,您就可以整天添加行。
要使其正常工作,您需要做两件事:
基本上,这加起来构成了一个函数,该函数既为行生成gui项目,又生成回调函数-创建者函数将“记住”小部件,并且其创建的回调将可以访问小部件。这是一个最小的示例:
def row_test():
window = cmds.window(title='lotsa rows')
column = cmds.columnLayout()
def add_row(cameraname) :
cmds.setParent(column)
this_row = cmds.rowLayout(nc=6, cw6 = (72, 72, 72, 72, 48, 48) )
cmds.text(l= cameraname )
cmds.text(l=u'Frame Range')
start = cmds.intField()
finish = cmds.intField()
# note: buttons always fire a useless
# argument; the _ here just ignores
# that in both of these callback functions
def do_delete(_):
cmds.deleteUI(this_row)
def do_render(_):
startframe = cmds.intField(start, q=True, v=True)
endframe = cmds.intField(finish, q=True, v=True)
print "rendering ", cameraname, "frames", startframe, endframe
cmds.button(l=u'render',c=do_render)
cmds.button(l=u'delete',c=do_delete)
for cam in cmds.ls(type='camera'):
add_row(cam)
cmds.showWindow(window)
row_test()
通过在add_row()
内部定义回调函数,它们可以访问存储为start
和finish
的小部件。即使start
和finish
将在函数每次运行时一次又一次地创建,它们存储的值仍由闭包捕获,并且当您单击按钮时仍然可用。它们还继承了cameraname
的值,因此渲染脚本也可以获取该信息。
冒着自我广告的风险:如果您需要使用cmds进行认真的GUI工作,则应签出mGui-一个Python模块,该模块使使用cmds gui减轻了复杂项目的痛苦。