如何将窗格添加到 nuke 并在 GUI 中使用它?

How can I add a pane to nuke and use it inside the GUI?

我正在尝试创建一个 nuke 窗格,我可以像调用嵌入式窗格一样调用它。 到目前为止,我可以在 'custom windows' 菜单中看到它,但是当我按下按钮时,面板显示为空。

我知道代码正在运行,因为当我在脚本编辑器中 copy/paste 它时,它可以按预期运行,但我可能缺少一些需要填充我的窗格的函数。

我正在使用 QtWidgets,这是我简化的代码:

class NukePanel_AssetManager(QtWidgets.QWidget):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)
        self.setLayout(QtWidgets.QVBoxLayout())
        myTable    = QtWidgets.QTableWidget()
        # all my functions and the things I am creating #
        self.layout().addWidget(myTable)

pane = nuke.getPaneFor('Properties.1')
panels.registerWidgetAsPanel('NukePanel_AssetManager', 'Asset Manager', 'uk.co.thefoundry.NukePanel_AssetManager', True).addToPane(pane)

我错过了什么?

这可能与定义面板的位置有关。由于 registerWidgetAsPanel 中的第一个参数是面板名称 class 的字符串表示形式(太奇怪了),它在脚本面板中有效(因为它就在那里定义),但当你'通过 init 加载它(因为它实际上是在您的模块中定义的)。如果您的模块名为 MyPanels:

from nukescripts.panels import registerWidgetAsPanel

pathToClass='MyPanels.NukePanel_AssetManager' #the full python path to your panel
HRName='Asset Manager' #the Human-readable name you want for your panel
regName='NukePanel.AssetManager' #the internal registered name for this panel (used for saving and loading layouts)

registerWidgetAsPanel(pathToClass, HRName, regName)

Nuke 有一些奇怪和不一致的模块导入;如果您仍然遇到问题,请尝试将您的 panel/module 添加为 nuke 模块下的变量,该模块随处可用:

import nuke
from MyPanels import NukePanel_AssetManager

nuke.NukePanel_AssetManager=NukePanel_AssetManager

Hacky,但在过去帮了我很多忙!

模态面板

在 Nuke GUI 中使用常规模式窗格的最简单方法如下:

import nuke

pane = nuke.Panel('Set number of Blur nodes')
pane.addSingleLineInput('Number of Blur nodes', '')
pane.show()

someInput = pane.value('Number of Blur nodes')

if someInput <= "0": 
    nuke.message('ERROR\nSet a number between 1 and 3')
elif someInput >= "4":
    nuke.message('ERROR\nSet a number between 1 and 3')
elif "1" <= someInput <= "3":
    nuke.message('number of Blur nodes: ' + someInput)
    
    for _ in list(range(1, int(someInput[0]) + 1)):
        nuke.createNode('Blur', inpanel = False)


非模态窗格

当然,您经常需要非模态窗格,如图片所示:

import nuke
import nukescripts

class Panes:

    def createPane(self):
        pythonPanel = nukescripts.PythonPanel('Keying Panel')
        knob = nuke.Keyer_Knob('keyer', 'range')
        knob.setValue( [0.0, 0.075, 0.5, 1.0] )
        pythonPanel.addKnob(knob)
        pythonPanel.addToPane()
        return self

Panes().createPane()

这解决了!!

import nukescripts
import myPanelScript


pathToClass='myPanelScript.NukePanel_AssetManager' #the full python path to your panel
HRName='Asset Manager' #the Human-readable name you want for your panel
regName='NukePanel.AssetManager' #the internal registered name for this panel (used for saving and loading layouts)

nukescripts.panels.registerWidgetAsPanel(pathToClass, HRName, regName, True).addToPane(nuke.getPaneFor('Properties.1'))

感谢大家的回答,如果没有你们的投入,我将无法完成!!