如果语句执行时,它的假

问题描述:

我得到“旋钮已经连接到一个节点”当我尝试添加一个旋钮如果语句执行时,它的假

我得到这个当我尝试从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 .. 。

谢谢!

+4

出示您的[MCVE。 –

+0

您可以在[The Foundry的NUKE Python论坛]上找到更好的答案(http://community.thefoundry.co.uk/discussion/forum.aspx?f=190)。 – Matt

首先,我要将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它似乎可能会发生几件事:

  1. 节点可能或可能不是在返回列表中的旋钮。如果你知道你只需要旋钮,你可以按类的类型进行过滤。我认为这可能看起来像nuke.allNodes(nuke.Knob)
  2. 我不认为nuke.Knob.knob(str)是它的名字或标签的测试。我阅读文档意味着您的测试应该是:if i.name != "tempMb":或可能if i.label != "tempMb"这取决于您如何创建t

但是,我认为这里可能有一个逻辑错误。如果你有2个节点(如果你做了上述改变,让我们假设它们都是旋钮),并且当你遍历所有节点时,第一个节点是tempMb,那么当你检查第二个节点时,它不会是那个你会尝试添加t,我假设它也被命名为tempMb。所以这就是为什么它看起来好像总是出现负面情况。

您需要在以下两种方式之一进行重组:

  1. 循环之前,设置一个假布尔,在循环播放设置为true,当旋钮tempMb被发现;一旦发生这种情况,您可以立即退出环路。循环后检查布尔值,看看是否可以安全地添加t
  2. 我看到一个可能的函数nuke.exists(s),它告诉你是否有任何名为s的“item”。

也许消除环路和写:如果你的旋钮存在

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

你会如何检查是否有旋钮?因为“如果不是i.knob(”tempMb“):”在这种情况下不起作用 编辑:我试图找到一些关于这个API的信息..虽然找不到任何东西... – masky007

+0

@ masky007阅读我的点1和2,然后按照链接到文档,如果你认为我在正确的轨道上(并且很难告诉我没有看到什么时候创建't'或任何其他节点或旋钮),然后尝试那些建议。我希望他们帮助。 – dlamblin

+0

@ masky007我增加了更多,因此以前的评论指的是第一点1和第2点。但我认为真正的问题是移动中的逻辑问题。对于每个不是'tempMb'的节点,你都加上't'。这听起来不像你想要做的。 – dlamblin

nuke.exists("Name of Knob")将检查。尝试在你的if语句中使用它。

有关Nuke forum的更多详细信息。

又见Documentation on nuke.exists

尝试这种解决方案:

t = nuke.Int_Knob('tempMb', 'tempMb') 

for i in nuke.allNodes(): 
    if not i.knob("tempMb"): 
     if nuke.exists("sum0"): 
      nuke.message("First tmp knob created") 
      i.addKnob(t) 
     else: 
      nuke.message("Second tmp knob created") 
    else: 
     nuke.message("No knob created") 

enter image description here