gpt4 book ai didi

python - Maya 窗口使用 python 动态添加行

转载 作者:行者123 更新时间:2023-12-01 08:28:36 25 4
gpt4 key购买 nike

我已经为此工作了一段时间,但找不到任何有关向窗口添加行的信息。我看到它是用 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 )

最佳答案

这完全可以通过 cmd 实现。 技巧只是构建代码,以便每行中的按钮知道并可以对该行中的小部件进行操作;一旦成功,您就可以整天添加行。

要使其发挥作用,您需要做两件事:

  1. 不要使用回调的字符串形式。由于详细原因,这从来都不是一个好主意here
  2. 使用closures确保您的回调引用正确的小部件。如果做得好,您可以做您想做的事情,而无需花费类(class)的费用。

基本上,这就是创建一个函数,既生成行的 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的值,因此渲染脚本也可以获取该信息。

At the risk of self-advertising: if you need to do serious GUI work using cmds you should check out mGui -- a python module that makes working with cmds gui less painful for complex projects.

关于python - Maya 窗口使用 python 动态添加行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54050777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com