Righto,有两件事你正在犯规。首先,在您尝试对字符串执行 setValue() 调用的原始代码中,您是对的,因为它不起作用。理想情况下使用两个调用之一(x.knob('name_of_the_knob')
或x['name_of_the_knob']
,与您的项目/设施/个人风格一致)来获取和设置旋钮对象的值。
从评论中,您的代码看起来像这样(我的评论是为其他不太熟悉 Nuke 的人添加的):
# select all the nodes
curSel = nuke.selectedNodes()
# nuke.thisNode() returns the script's context
# i.e. the node from which the script was invoked
knobToChange = nuke.thisNode()['knobname'].getValue()
codeIn = nuke.thisNode()['codeinput'].getValue()
for x in curSel:
x.knob(knobToChange).setValue(codeIn)
使用此示例 UI 和两个字段中的值,如图所示,按钮触发脚本...
...此代码将在您执行它时给您一条错误消息'Nothing is named "foo"',因为.getValue()
调用实际上是返回给您旋钮的评估结果- 这是它尝试执行时的错误消息TCL [value foo],并发现没有任何名为 foo 的对象。
理想情况下,您应该做的是调用.toScript()
返回原始文本的方法。
# select all the nodes
curSel = nuke.selectedNodes()
# nuke.thisNode() returns the script's context
# i.e. the node from which the script was invoked
knobToChange = nuke.thisNode()['knobname'].toScript()
codeIn = nuke.thisNode()['codeinput'].toScript()
for x in curSel:
x.knob(knobToChange).setValue(codeIn)
您可以通过根据原始代码构建一个字符串、添加方括号等来回避这个问题,但是是的,这是一个痛苦,一个维护噩梦,并开始沿着构建对象的路线走下去来自字符串(@mgilson 解释了如何在 a globals()
oreval()
方法中进行操作)
对于那些没有享受过使用 Nuke 的乐趣的人,这里有一个小屏幕截图,可能(或可能不......)提供更多背景信息: