加载或保存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')
答案 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级别窗口操作以外的其他东西隐藏时,回调被取消注册。这是非常可靠的,除了当您更改到窗口小部件窗格中的另一个选项卡(如果它已停靠)时,您的回调也将被取消注册。显然,当你的标签再次激活时,它们会被重新添加。这是一个相当小的惩罚,但我仍然认为值得指出的是,虽然这种方法非常接近理想,但它并不完美。
无论如何,我会让你自己决定哪两个你更喜欢,但我希望这会有所帮助。