You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python设置Nuke CornerPin节点Autolabel后Label的TCL功能失效

解决Nuke自定义CornerPin2D节点Label无法解析TCL表达式的问题

问题根源

你的代码中,autolabel函数通过Python提前解析了Label中的TCL表达式(nuke.tcl("expr", "[value ref_frame]")),导致标签内容变成静态字符串,无法随旋钮值动态更新。正确的做法是让Nuke原生解析TCL表达式,而不是在Python中提前计算。

解决方案

方案1:Python构造TCL表达式字符串

通过Python返回包含TCL逻辑的字符串,让Nuke自动解析其中的动态表达式,包括用户在Label旋钮中输入的内容:

def customCornerPin():
    n = nuke.thisNode()
    # 添加自定义旋钮
    ref_frame_knob = nuke.Int_Knob('ref_frame', "reference frame")
    n.addKnob(ref_frame_knob)
    
    set_frame_knob = nuke.PyScript_Knob('setFrame', "set to current frame", 
                                       'nuke.thisNode()["ref_frame"].setValue(nuke.frame())')
    n.addKnob(set_frame_knob)
    
    stabilize_knob = nuke.Boolean_Knob('stabilize', "stabilize")
    stabilize_knob.setFlag(nuke.STARTLINE)
    n.addKnob(stabilize_knob)

    # 设置节点表达式
    n["from1"].setExpression("to1(ref_frame)")
    n["from2"].setExpression("to2(ref_frame)")
    n["from3"].setExpression("to3(ref_frame)")
    n["from4"].setExpression("to4(ref_frame)")
    n["invert"].setExpression("stabilize")

    # 设置默认值
    n["ref_frame"].setValue(1001)
    n["label"].setValue("[value ref_frame]")

# 定义autolabel逻辑,返回TCL表达式字符串
def cornerPinLabel():
    base_tcl = '[value name]\\n([value stabilize] ? "stabilize" : "matchmove")'
    # 如果用户输入了自定义Label,追加让Nuke自动解析
    if nuke.thisNode()['label'].value().strip():
        base_tcl += '\\n[value label]'
    return base_tcl

# 注册autolabel(仅执行一次,避免重复注册)
try:
    nuke.removeAutolabel(cornerPinLabel, nodeClass="CornerPin2D")
except:
    pass
nuke.addAutolabel(cornerPinLabel, nodeClass="CornerPin2D")

nuke.addOnCreate(customCornerPin, nodeClass="CornerPin2D")

方案2:原生TCL编写Autolabel

直接用Nuke原生的TCL脚本编写autolabel,更贴合Nuke的标签解析机制:

def customCornerPin():
    n = nuke.thisNode()
    # 添加自定义旋钮
    ref_frame_knob = nuke.Int_Knob('ref_frame', "reference frame")
    n.addKnob(ref_frame_knob)
    
    set_frame_knob = nuke.PyScript_Knob('setFrame', "set to current frame", 
                                       'nuke.thisNode()["ref_frame"].setValue(nuke.frame())')
    n.addKnob(set_frame_knob)
    
    stabilize_knob = nuke.Boolean_Knob('stabilize', "stabilize")
    stabilize_knob.setFlag(nuke.STARTLINE)
    n.addKnob(stabilize_knob)

    # 设置节点表达式
    n["from1"].setExpression("to1(ref_frame)")
    n["from2"].setExpression("to2(ref_frame)")
    n["from3"].setExpression("to3(ref_frame)")
    n["from4"].setExpression("to4(ref_frame)")
    n["invert"].setExpression("stabilize")

    # 设置默认值
    n["ref_frame"].setValue(1001)
    n["label"].setValue("[value ref_frame]")

# 注册TCL版autolabel
nuke.addAutolabel('''
set base_label "[value name]\\n([value stabilize] ? "stabilize" : "matchmove")"
set user_label [value label]
if {$user_label ne ""} {
    append base_label "\\n$user_label"
}
return $base_label
''', nodeClass="CornerPin2D")

nuke.addOnCreate(customCornerPin, nodeClass="CornerPin2D")

关键改进点

  1. 动态解析表达式:不再在Python中提前计算Label内容,而是让Nuke原生解析TCL表达式,确保标签随旋钮值实时更新。
  2. 避免重复注册:将nuke.addAutolabel移到节点创建函数外,仅执行一次,防止多次注册导致的逻辑重复。
  3. 保留用户自定义Label:自动追加用户在Label旋钮中输入的内容,同时支持其中的TCL表达式解析。

内容的提问来源于stack exchange,提问作者zainea13

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 04:58:10