我在maya中有一个功能,该功能可以导入其他功能,并创建一个带有用于特定功能按钮的架子。我有一个功能可以正常工作的scriptJob命令。如果我手动而不是通过任务栏按钮导入该文件,但是在使用任务栏脚本运行该文件时给出了NameError。
这是脚本的示例 myShelf.py文件:
import loopingFunction
loopingFunction.runThis()
loopingFunction.py文件:
import maya.cmds as mc
def setSettings():
#have some settings set before running this
runThis()
def runThis():
print "yay this ran"
evalDeferred(mc.scriptJob(ro=True,ac=["'someMesh.outMesh',runThis"])
如果通过架子功能运行此命令,则会得到一个runThis nameError is not defined
,如果尝试将scriptJob命令修改为loopingFunction.runThis
,则会得到一个nameError loopingFunction is not defined
(不确定是否使用{{ 1}}甚至是正确的,老实说
不知道如何解决该问题而不必手动导入函数而不是通过文件架文件。
答案 0 :(得分:1)
将字符串引用用于此类回调函数通常会导致范围问题。 (有关更多信息,以及为什么不使用字符串,here)
如果您将函数作为对象直接传递给回调,而不是使用字符串,则它应该与实际导入的代码一样正常工作。
在这种情况下,您需要evalDeferred-您是否确实需要它? -因此有助于在实际代码周围添加一些功能,以便稍后实际创建scriptjob –否则,将在安排延迟之前对其进行评估。
import tkinter as tk
win_about = tk.Tk()
win_about.geometry("340x500")
win_about.title("About Us")
win_about.resizable(0,0)
label = tk.Label(win_about, text="img_png", fg="black")
label.place(anchor='center', relx =.5, rely=.3)
mess = tk.Label(win_about, text='Version: 1.0', font=12)
mess.place(anchor='center', relx=.5, rely=.7)
win_about.mainloop()
在def runThis():
print "callback ran"
def do_scriptjob():
cmds.scriptJob(ro=True, ac=('someMesh.outMesh', runThis)
cmds.evalDeferred(do_scriptjob)
和runThis
中,我都没有添加括号-我们让evalDeferred和scriptJob具有函数 objects ,它们在准备就绪时可以调用。使用括号会传递函数的结果,这不是您想要的。
偶然地,您似乎正在尝试在scriptJob自身内部创建scriptJob的新副本。最好只是放下do_scriptjob
标志,而让scriptJob摆在身边-如果runOnce
中的某些内容实际上影响了runThis
属性,则您的Maya将会陷入无限循环。我没有在示例中更改结构,但如果可以避免的话,我不建议编写这种自我复制代码。
答案 1 :(得分:0)
您遇到了嵌套/玛雅范围变量的问题
mc.scriptJob(ro=True,ac=["'someMesh.outMesh',runThis"]
此行是在主maya范围(如全局)中求值的maya命令字符串。 由于您的函数具有一个带有import的名称空间:“ loopingFunction”,因此您需要在字符串命令中对其进行强制。
import loopingFunction
loopingFunction.runThis()
您应该写
evalDeferred(mc.scriptJob(ro=True,ac=["'someMesh.outMesh',loopingFunction.runThis"])
如果您想要更一般的内容,可以这样做:
def runThis(ns=''):
print "yay this ran"
if ns != '':
ns += '.'
evalDeferred(mc.scriptJob(ro=True,ac=["'someMesh.outMesh',{}runThis".format(ns)])
然后在架子上运行:
import loopingFunction
loopingFunction.runThis('loopingFunction')
像这样,您可以编写任何形式的namepsaces:
import loopingFunction as loopF
loopF.runThis('loopF')