使用回调来使用类中的当前值来运行函数

时间:2016-05-25 11:12:32

标签: python maya

我努力想到一个好头衔,所以我在这里解释一下。我在Maya中使用Python,它有一些事件回调选项,所以你可以做on save: run function之类的事情。我有一个用户界面类,我希望它在触发某些事件时更新,我可以这样做,但我正在寻找一种更清晰的方法。

这是一个类似于我的基本示例:

class test(object):
    def __init__(self, x=0):
        self.x = x
    def run_this(self):
        print self.x
    def display(self):
        print 'load user interface'

#Here's the main stuff that used to be just 'test().display()'
try:
    callbacks = [callback1, callback2, ...]
except NameError:
    pass
else:
    for i in callbacks:
        try:
            OpenMaya.MEventMessage.removeCallback(i)
        except RuntimeError:
            pass

ui = test(5)
callback1 = OpenMaya.MEventMessage.addEventCallback('SomeEvent', ui.run_this)
callback2 = OpenMaya.MEventMessage.addEventCallback('SomeOtherEvent', ui.run_this)
callback3 = ......
ui.display()

在Maya重新启动之前,回调仍然存在,但如果您传递removeCallback返回的值,则可以使用addEventCallback将其删除。我目前的方式是在设置之前检查变量是否已设置,这比前一行test().display()

更加混乱

有没有办法可以在功能中整齐地做到这一点?如果我再次运行test类或类似的东西,它会删除旧的那个?

1 个答案:

答案 0 :(得分:1)

您可能有两种方法可以尝试这种方法。

你可以拥有一个表示你的回调管理器的持久对象,并允许它挂钩和取消挂钩。

import maya.api.OpenMaya as om
import maya.cmds as cmds
om.MEventMessage.getEventNames()

class CallbackHandler(object):

    def __init__(self, cb, fn):
        self.callback = cb
        self.function  = fn
        self.id = None

    def install(self):
        if self.id:
            print "callback is currently installed"
            return False
        self.id = om.MEventMessage.addEventCallback(self.callback, self.function)
        return True

    def uninstall(self):
        if self.id:
            om.MEventMessage.removeCallback(self.id)
            self.id = None
            return True
        else:
            print "callback not currently installed"
            return False

    def __del__(self):
        self.uninstall()

def test_fn(arg):
    print "callback fired 2", arg

cb = CallbackHandler('NameChanged', test_fn)
cb.install()
# callback is active
cb.uninstall()
# callback not active
cb.install()
# callback on again
del(cb) # or cb = None
# callback gone again

在此版本中,只要您希望回调保持不变,然后手动卸载它们,或者在不再需要它们时让它们超出范围,您就会存储您创建的CallbackHandlers。

另一种选择是创建自己的对象来表示回调,然后添加或删除您希望它在您自己的代码中触发的任何函数。这使管理层完全站在您的一边,而不是依赖于api,这可能是好的,也可能是坏的,具体取决于您的需求。你有一个可调用的Event()类(使用__call__(),它会有一个要触发的函数列表,然后由Maya调用它'__call__()。这是一个类似的例子您想要的事件处理程序对象here