Существует 3 способа передачи параметра в функцию обратного вызова.
1:
Вы можете использовать partial
. Это часто используется в событиях пользовательского интерфейса, таких как Qt
, а также для передачи параметров, и вы можете сделать то же самое здесь:
from functools import partial
import maya.cmds as cmds
def delete_cube(cube):
if cmds.objExists(cube):
cmds.delete(cube)
cube = "pCube1"
cid = cmds.scriptJob(ac=["pCube2.translateY", partial(delete_cube, cube)])
2:
Подобно первому методу, Другой популярный способ - использовать lambda
. Единственным преимуществом является то, что это встроенная команда, и ей не нужно импортировать какой-либо модуль, но ее синтаксис может быть менее читабельным с первого взгляда:
import maya.cmds as cmds
def delete_cube(cube):
if cmds.objExists(cube):
cmds.delete(cube)
cube = "pCube1"
cid = cmds.scriptJob(ac=["pCube2.translateY", lambda x=cube: delete_cube(x)])
3:
Или Вы можете передать его как строку, но вам нужно правильно отформатировать параметры, включая кавычки, если сам параметр является строкой:
import maya.cmds as cmds
def delete_cube(cube):
if cmds.objExists(cube):
cmds.delete(cube)
cube = "pCube1"
cid = cmds.scriptJob(ac=["pCube2.translateY", "delete_cube('{}')".format(cube)])
Вам не обязательно использовать .format
, вы можете объединить строки с +
или %
. Лично я предпочитаю 1-й метод с partial
, так как он выглядит чище с меньшим количеством суеты.
Несколько заключительных замечаний:
- В функцию обратного вызова вы должны включить условную проверку с помощью
cmds.objExists
, чтобы убедиться, что то, что вы собираетесь удалить, действительно существует, в противном случае оно выдаст ошибку. - Не забудьте записать результат
cmds.scriptJob
в переменную, чтобы вы могли легко удалить его позже с cmds.scriptJob(kill=cid)
.