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

Nuke中PySide自定义控件无法保留值问题求助

解决Nuke PyCustom_Knob控件值重置的问题

我之前也碰到过一模一样的问题!核心原因是你没有把PySide控件的值和Nuke的PyCustom_Knob本身的存储绑定起来——Nuke节点的参数是存在Knob的value属性里的,而你现在只把值存在了控件自己的myValue变量里,面板关闭后控件实例被销毁,值自然就丢失了。

要解决这个问题,我们需要实现控件和Knob值的双向同步,下面是修改后的完整代码,我会逐点解释关键修改:

from PySide import QtGui, QtCore
import nuke

class myPyKnob(QtGui.QSpinBox):
    def __init__(self, node):
        super(self.__class__, self).__init__()
        self.node = node
        # 从Knob读取已有值,没有则设默认值1
        target_knob = self.node.knob("MyWidget")
        knob_value = target_knob.value()
        self.setValue(knob_value if knob_value is not None else 1)
        # 绑定值变化信号
        self.valueChanged.connect(self.valueChangedKnob)

    # Nuke要求的创建UI方法,返回控件本身
    def makeUI(self):
        return self

    # 关键:Nuke刷新控件时会调用这个方法,必须从Knob拉取最新值
    def updateValue(self):
        target_knob = self.node.knob("MyWidget")
        knob_value = target_knob.value()
        if knob_value is not None:
            # 避免不必要的信号触发,暂时断开连接
            self.valueChanged.disconnect(self.valueChangedKnob)
            self.setValue(knob_value)
            self.valueChanged.connect(self.valueChangedKnob)

    # 关键:控件值变化时,同步回Knob的value属性,让Nuke保存
    def valueChangedKnob(self):
        current_value = self.value()
        target_knob = self.node.knob("MyWidget")
        target_knob.setValue(current_value)
        print(f"控件值已同步到Knob: {current_value}")

if __name__ == '__main__':
    node = nuke.selectedNode()
    # 先检查是否已有该Knob,避免重复添加
    if not node.knob("MyWidget"):
        # 创建PyCustom_Knob,指定名称、显示标签和控件类
        knob = nuke.PyCustom_Knob("MyWidget", "自定义数值", "myPyKnob(nuke.thisNode())")
        # 设置Knob的初始值,确保第一次创建时有值可读取
        knob.setValue(1)
        node.addKnob(knob)

核心修改点说明:

  • 初始化时从Knob读值:不再硬编码默认值,而是从对应的PyCustom_Knob中读取已保存的值,如果是第一次创建则用默认值1,这样重新打开面板时会加载之前的设置。
  • 实现updateValue方法:这个方法是Nuke内置的回调,当节点参数变化(比如重新打开面板、撤销/重做操作)时,Nuke会调用它来刷新控件显示,必须在这里把Knob的最新值同步到控件上。
  • 控件值变化同步回Knob:在valueChangedKnob方法中,把控件的当前值写入Knob的value属性,这样Nuke会把这个值保存到节点的参数数据中,即使关闭面板或重启Nuke,值也不会丢失。
  • 避免重复添加Knob:在主逻辑中检查节点是否已有该Knob,防止多次运行脚本重复添加。

这样修改后,你的控件值就会和Nuke节点的参数绑定,关闭面板再打开时就能保留之前的设置了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:39:16