尝试添加旋钮时,出现“旋钮已连接到节点”的提示

当我尝试从menu.py按钮运行我的代码时,出现此错误。如果我从脚本编辑器运行脚本,则不会收到错误消息。

for i in nuke.allNodes():
    if not i.knob("tempMb"):
        if sum0 == 0:
            nuke.message("first tmp knob created")
            i.addKnob(t)
        elif sum0 != 0:
            nuke.message("second tmp knob created")
    else:
        nuke.message("no nob created")


即使我检查是否有一个名为tempMb的旋钮,也仍然执行它,好像没有。
编辑:“ t”更早地定义为Int_Knob ...

谢谢!

最佳答案

首先,我将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)不会检查该名称是否存在旋钮,否则您的代码将表现出预期的行为。因此,当我阅读the docs时,似乎可能发生了几件事:


节点可能是也可能不是返回列表中的旋钮。如果知道只需要旋钮,则可以按类类型进行过滤。我认为可能看起来像nuke.allNodes(nuke.Knob)
我不认为nuke.Knob.knob(str)是对其名称或标签的测试。我阅读的文档暗示您的测试应该是:if i.name != "tempMb":或可能是if i.label != "tempMb",这取决于您创建t的方式。


尽管继续,我认为这里可能存在逻辑错误。如果您有2个节点(如果进行了上述更改,则假定它们都是旋钮),并且当您遍历所有节点时,第一个是tempMb,那么当您检查第二个节点时,它不会就是这样,您将尝试添加t,我假设它也被命名为tempMb。所以这就是为什么您看上去总是在出现负面情况的原因。

您需要采用以下两种方法之一进行重组:


在循环之前,设置一个错误的布尔值,在循环中,当找到tempMb旋钮时将其设置为true;否则,将其设置为true。您最好在发生这种情况后立即退出循环。循环后,检查布尔值以查看添加t是否安全。
我看到一个可能的函数nuke.exists(s),它告诉您是否有任何名为s的“项目”。


也许删除循环并编写以下代码:

 if not nuke.exists("tempMb"):
     # Add your knob. I'm actually not seeing `addKnob` in the docs.

09-06 08:37