首先,我要将 更改elif
为 只是else
因为您的 if 条件已经在测试 elif 条件,而我看不到在这段代码中会发生什么变化。
for i in nuke.allNodes():
if not i.knob("tempMb"):
if sum0 == 0:
nuke.message("first tmp knob created")
i.addKnob(t)
else:
nuke.message("second tmp knob created")
else:
nuke.message("no nob created")
其次,我假设它i.knob(string)
不会检查是否存在该名称的旋钮,否则您的代码将表现得更符合您的预期。因此,当我阅读文档时,似乎可能会发生几件事:
- 节点可能是也可能不是返回列表中的旋钮。如果你知道你只想要旋钮,你可以按类类型过滤。我认为这可能看起来像
nuke.allNodes(nuke.Knob)
。
- 我不认为 nuke.Knob.knob(str) 是对其名称或标签的测试。我阅读文档暗示您的测试应该是:
if i.name != "tempMb":
或者可能if i.label != "tempMb"
取决于您如何创建t
.
继续前进,我认为这里可能存在逻辑错误。如果您有 2 个节点(并且如果您进行了上述更改,我们假设它们都是旋钮),并且当您遍历所有节点时,第一个节点是tempMb
,那么当您检查第二个节点时,它不会是那个和您将尝试添加t
,我假设它也已命名tempMb
。所以这就是为什么它看起来好像负面情况总是在发生。
您需要通过以下两种方式之一进行重组:
- 在循环之前,设置一个 false 布尔值,在循环中,当
tempMb
找到旋钮时将其设置为 true;一旦发生这种情况,您也可以退出循环。循环后检查布尔值是否可以安全添加t
.
- 我看到了一个可能的函数
nuke.exists(s)
,它告诉你是否有任何名为s
.
也许删除循环并编写以下内容:
if not nuke.exists("tempMb"):
# Add your knob. I'm actually not seeing `addKnob` in the docs.