如何将窗格添加到 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'))
感谢大家的回答,如果没有你们的投入,我将无法完成!!
我正在尝试创建一个 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'))
感谢大家的回答,如果没有你们的投入,我将无法完成!!