1

所以我知道这是一种解决方法,并且可能有更好的方法来做到这一点,但这是交易。我已经简化了从哪里收集这些信息的代码,并且只是给出了可靠的值。

curSel = nuke.selectedNodes()
knobToChange = "label"
codeIn = "[value in]"

kcPrefix = "x"
kcStart = "['"
kcEnd = "']"

changerString = kcPrefix+kcStart+knobToChange+kcEnd


for x in curSel:
    changerString.setValue(codeIn)

但我得到了我想我会的错误 - 这是一个字符串没有属性“setValue”

这是因为如果我只输入 x['label'] 而不是 changerString,它就可以工作,但即使 changer string 说的完全相同,它也会被读取为字符串而不是代码。

有任何想法吗?

4

2 回答 2

5

看起来您正在寻找一些东西来根据您当前的命名空间将字符串评估为 python 对象。一种方法是使用globals字典:

globals()['x']['label'].setValue(...)

换句话说,和globals()['x']['label']是一样的x['label']

或者为您的情况明确说明:

globals()[kcPrefix][knobToChange].setValue(codeIn)

其他人可能会建议eval

eval('x["label"]').setValue(...)  #insecure and inefficient

globals在这里绝对是一个更好的主意。


最后,通常当你想做这样的事情时,你最好首先使用字典或其他类型的数据结构来让你的数据更有条理

于 2013-01-07T16:06:10.377 回答
2

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 和两个字段中的值,如图所示,按钮触发脚本...

带有相关按钮的示例 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 的乐趣的人,这里有一个小屏幕截图,可能(或可能不......)提供更多背景信息:

来自 Nuke 的示例屏幕,显示节点图和属性对话框

于 2013-01-07T16:23:34.220 回答