简单的解决方案是将回调注册添加到您的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
组合和一些猜测,像这样的最接近比操作系统级的窗口操作。这非常可靠,除了当您切换到小部件窗格中的另一个选项卡(如果它已停靠)时,您的回调也将被取消注册。当你的标签被再次激活时,它们显然会被重新添加。这是一个相当小的惩罚,但我仍然认为值得指出的是,虽然这种方法非常接近理想,但并不完美。
无论如何,我会留给你决定哪两个你更喜欢哪一个,但我希望这有助于。
非常感谢 – Ash 2014-12-08 06:47:06