Nuke中的刷新(更新)小部件(vfx soft)

时间:2014-12-04 10:46:49

标签: python python-2.7 widget pyside nuke

加载或保存nuke脚本后,我需要在Nuke(合成软件)中刷新(更新)GUI小部件(pySide)。 回调:nuke.addOnScriptSave()和nuke.addOnScriptLoad()

import nuke
from PySide import QtGui, QtCore
from nukescripts import panels


class Info(QtGui.QWidget):
    def __init__(self,  parent=None):
        QtGui.QWidget.__init__(self, parent)      
        self.initUI()

    def scriptName(self): 
        sName = (nuke.root().name()).split('/')#split name from root
        return sName


    def initUI(self): 

        self.lbl1 = QtGui.QLabel("script name : " , self)

        layout = QtGui.QHBoxLayout()#main layout
        layout.addWidget(self.lbl1) 
        self.setLayout(layout)

        self.updateInfo()

    def updateInfo(self):

        scriptName = self.scriptName()

        self.lbl1.setText("script name : " + scriptName[-1].split('.')[0])#set name 


panels.registerWidgetAsPanel('Info', 'Info_script', 'infoscript')

1 个答案:

答案 0 :(得分:0)

简单的解决方案是将回调注册添加到窗口小部件的__init__

class Info(QtGui.QWidget):
    def __init__(self,  parent=None):
        QtGui.QWidget.__init__(self, parent)      
        self.initUI()
        nuke.addOnScriptSave(self.updateInfo)
        if nuke.root().name() == 'Root' and not nuke.modified():
            # No reason to add a scriptLoad callback if opening a
            # script would spawn a new Nuke process.
            nuke.addOnScriptLoad(self.updateInfo)

    # Rest of the class definition omitted for brevity

这种方法确实有一个明显的缺点:因为Nuke的回调注册表现在至少包含一个对小部件的updateInfo方法的引用,所以小部件永远不会被Python垃圾收集。这在现实生活中可能永远不会太大,因为您可能只会创建非常少量的面板实例,但如果您创建了1000个实例,那么您将有1000个回调注册永远不会未注册(即使小组已关闭)。

不幸的是,当您的小部件从UI中删除时,Nuke并没有真正为您提供任何钩子,因此很难确定是否有时间取消注册您的回调。你可以得到的最接近的可能是使用showEvent / hideEvent组合和一些猜测,如下所示:

class Info(QtGui.QWidget):
    def __init__(self,  parent=None):
        QtGui.QWidget.__init__(self, parent)      
        self.initUI()
        self.callbacksRegistered = False

    def addCallbacks(self):
        nuke.addOnScriptSave(self.updateInfo)
        if nuke.root().name() == 'Root' and not nuke.modified():
            # No reason to add a scriptLoad callback if opening a
            # script would spawn a new Nuke process.
            nuke.addOnScriptLoad(self.updateInfo)

    def removeCallbacks(self):
        self.removeOnScriptSave(self.updateInfo)
        self.removeOnScriptLoad(self.updateInfo)

    def showEvent(self, event):
        if not (self.callbacksRegistered or event.spontaneous()):
            self.addCallbacks()
            self.callbacksRegistered = True

    def hideEvent(self, event):
        if self.callbacksRegistered and not event.spontaneous():
            # "Spontaneous" hide events are sent when the Nuke
            # window is minimized, which we don't really care
            # about.
            self.removeCallbacks()
            self.callbacksRegistered = False

    # Rest of the class definition omitted for brevity

回调注册被移入showEvent方法,并且当窗口小部件被OS级别窗口操作以外的其他东西隐藏时,回调被取消注册。这是非常可靠的,除了当您更改到窗口小部件窗格中的另一个选项卡(如果它已停靠)时,您的回调也将被取消注册。显然,当你的标签再次激活时,它们会被重新添加。这是一个相当小的惩罚,但我仍然认为值得指出的是,虽然这种方法非常接近理想,但它并不完美。

无论如何,我会让你自己决定哪两个你更喜欢,但我希望这会有所帮助。