2014-12-04 106 views
0

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

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

回答

0

简单的解决方案是将回调注册添加到您的widget的__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个回调被注册,这永远不会是未注册(即使面板已关闭)。

不幸的是,Nuke并没有真正给你任何挂钩实施,当你的小部件被从UI中删除,所以很难有一个肯定的方式知道是时候注销你的回调。

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方法和回调是未注册当小部件被其他的东西隐藏的:你可以很可能使用showEvent/hideEvent组合和一些猜测,像这样的最接近比操作系统级的窗口操作。这非常可靠,除了当您切换到小部件窗格中的另一个选项卡(如果它已停靠)时,您的回调也将被取消注册。当你的标签被再次激活时,它们显然会被重新添加。这是一个相当小的惩罚,但我仍然认为值得指出的是,虽然这种方法非常接近理想,但并不完美。

无论如何,我会留给你决定哪两个你更喜欢哪一个,但我希望这有助于。

+0

非常感谢 – Ash 2014-12-08 06:47:06