Maya窗口使用python

时间:2019-01-05 09:43:57

标签: python window row maya

我已经研究了一段时间了,但是找不到有关在窗口中添加行的任何信息。我看到它是用pyside2和qt完成的,女巫可以使用,但用户使用的是Maya的多个版本(2016 = pyside,2017 = pyside2)。

我希望它像在pyside中添加小部件一样。我这样做是在添加行的功能类似于添加行1,添加行2和添加行3的情况下进行的,但是脚本变长了。我需要将rowColumnLayout作为父项,并使其唯一,以便以后删除。另外,我必须查询每一行中的文本字段。也许是for循环在行中添加了数字?我真的不知道,但这是我到目前为止所拥有的:

screenshot of widget

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 )

1 个答案:

答案 0 :(得分:1)

这完全可以用cmds.来完成,其窍门只是构造代码,以便每行中的按钮都知道并可以在该行的小部件上进行操作;一旦可行,您就可以整天添加行。

要使其正常工作,您需要做两件事:

  1. 不要使用回调的字符串形式。由于here
  2. 详细说明的原因,这绝不是一个好主意
  3. 执行使用closures确保您的回调引用了正确的窗口小部件。做对了,您可以做自己想做的事,而无需增加类的开销。

基本上,这加起来构成了一个函数,该函数既为行生成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()内部定义回调函数,它们可以访问存储为startfinish的小部件。即使startfinish将在函数每次运行时一次又一次地创建,它们存储的值仍由闭包捕获,并且当您单击按钮时仍然可用。它们还继承了cameraname的值,因此渲染脚本也可以获取该信息。

  

冒着自我广告的风险:如果您需要使用cmds进行认真的GUI工作,则应签出mGui-一个Python模块,该模块使使用cmds gui减轻了复杂项目的痛苦。