Это полностью выполнимо с cmds.
Хитрость заключается в том, чтобы просто структурировать код так, чтобы кнопки в каждой строке знали и могли работать с виджетами в этой строке; как только это сработает, вы можете добавлять строки весь день.
Чтобы все заработало, нужно сделать две вещи:
- Не использовать строковую форму обратных вызовов. Это никогда не является хорошей идеей, по причинам, подробно изложенным здесь
- Do используйте замыкания , чтобы убедиться, что ваши обратные вызовы ссылаются на правильные виджеты. Если все сделано правильно, вы можете делать все, что хотите, без лишних затрат.
По сути, это сводится к созданию функции, которая генерирует элементы 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, вы должны проверить mGui - модуль python, который делает работу с cmds gui менее сложной для сложных проектов.