【问题标题】:How can I add a pane to nuke and use it inside the GUI?如何将窗格添加到 nuke 并在 GUI 中使用它?
【发布时间】:2021-01-01 20:25:55
【问题描述】:

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

我知道代码可以正常工作,因为当我在脚本编辑器中复制/粘贴它时,它可以正常工作,但我可能缺少一些需要填充窗格的功能。

我正在使用 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)

我错过了什么?

【问题讨论】:

    标签: python pyqt pyside2 qtwidgets nuke


    【解决方案1】:

    这可能与面板的定义位置有关。由于registerWidgetAsPanel 中的第一个参数是面板类名称的字符串表示形式(很奇怪),它可以在脚本面板中使用(因为它是在那里定义的),但在您通过 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 有一些奇怪且不一致的模块导入;如果您仍然遇到问题,请尝试将您的面板/模块添加为 nuke 模块下的变量,该模块随处可用:

    import nuke
    from MyPanels import NukePanel_AssetManager
    
    nuke.NukePanel_AssetManager=NukePanel_AssetManager
    

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

    【讨论】:

    • 谢谢,我在 menu.py 中尝试了您的第一个代码并对其进行了一些修改:code registerWidgetAsPanel(pathToClass, HRName, regName, True).addToPane(nuke.getPaneFor('Properties.1 ')) code 但我仍然没有得到它。按钮都在那里,但我还应该在表格中看到我的读取节点,但没有显示。有什么想法吗?
    • 嗯,这听起来像是一个单独的 QT 问题!如果您的面板显示在它应该在的位置,那么我们可能已经过了这段代码。
    【解决方案2】:

    模态窗格

    在 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()
    

    【讨论】:

    • 谢谢安迪,但这段代码会在新窗口中创建一个弹出窗格。但我需要像任何其他窗格一样将我的窗格嵌入到 GUI 中(例如节点图、属性、背景渲染、涂料表等)。
    • 嗨@Andy。不幸的是,它没有。我收到此错误:TypeError: __init__() 应该返回 None,而不是 'NukePanel_AssetManager'
    【解决方案3】:

    这样就解决了!!

    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'))
    

    谢谢大家的回答,如果没有你们的意见,这对我来说是不可能的!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-13
      相关资源
      最近更新 更多