具有 return 个变量的 ScriptJob 函数 maya Python
ScriptJob with return variables function maya Python
我 运行 遇到了 Maya 的 scriptJob 命令的问题:如果我为一个没有参数的函数创建一个 scriptJob,一切正常,但如果我需要将一个变量传递给该函数,它将由 scriptJob 执行它 returns 这个错误:
#Error: TypeError: file <maya console> line 5: Invalid arguments for flag 'ac'. Expected ( string, string or function ), got [ str, NoneType ]#
代码非常简单,我只想了解为什么会这样。
import maya.cmds as cmds
def a():
cube = "pCube1"
cmds.scriptJob(ac = ["pCube2.translateY", delete(cube)])
return cube
def delete(cube):
cmds.delete(cube)
cube = a()
a()
希望你能帮助我。
有 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
,可以用+
或%
拼接字符串。就我个人而言,我更喜欢使用 partial
的第一种方法,因为它感觉更干净,更省事。
一些结束语:
- 在您的回调函数中,您应该使用
cmds.objExists
进行条件检查,以确保您要删除的内容确实存在,否则会引发错误。
- 不要忘记在变量中捕获
cmds.scriptJob
的结果,以便您稍后可以使用 cmds.scriptJob(kill=cid)
轻松删除它。
我 运行 遇到了 Maya 的 scriptJob 命令的问题:如果我为一个没有参数的函数创建一个 scriptJob,一切正常,但如果我需要将一个变量传递给该函数,它将由 scriptJob 执行它 returns 这个错误:
#Error: TypeError: file <maya console> line 5: Invalid arguments for flag 'ac'. Expected ( string, string or function ), got [ str, NoneType ]#
代码非常简单,我只想了解为什么会这样。
import maya.cmds as cmds
def a():
cube = "pCube1"
cmds.scriptJob(ac = ["pCube2.translateY", delete(cube)])
return cube
def delete(cube):
cmds.delete(cube)
cube = a()
a()
希望你能帮助我。
有 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
,可以用+
或%
拼接字符串。就我个人而言,我更喜欢使用 partial
的第一种方法,因为它感觉更干净,更省事。
一些结束语:
- 在您的回调函数中,您应该使用
cmds.objExists
进行条件检查,以确保您要删除的内容确实存在,否则会引发错误。 - 不要忘记在变量中捕获
cmds.scriptJob
的结果,以便您稍后可以使用cmds.scriptJob(kill=cid)
轻松删除它。