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")
关键改进点
- 动态解析表达式:不再在Python中提前计算Label内容,而是让Nuke原生解析TCL表达式,确保标签随旋钮值实时更新。
- 避免重复注册:将
nuke.addAutolabel移到节点创建函数外,仅执行一次,防止多次注册导致的逻辑重复。 - 保留用户自定义Label:自动追加用户在Label旋钮中输入的内容,同时支持其中的TCL表达式解析。
内容的提问来源于stack exchange,提问作者zainea13
相关产品推荐
相关产品推荐

