2014-12-04 62 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