Q100385:如何使用 Python 在 Katana 中注册回调和事件处理程序,以根据用户操作添加自定义功能

关注

概括

本文介绍了如何在Katana中注册回调或事件处理程序,并详细介绍了在哪里可以找到有关可用回调和事件类型及其回调函数的预期输入参数的信息。
有关回调和事件的文档也可以在Katana开发人员指南中找到。下面的文章给出了一些如何实现它们的实际示例。

更多信息

回调是添加到Katana环境中的一段 Python 代码,当Katana中发生各种事件(例如创建节点或加载脚本)时,回调会自动运行。

事件是由于用户操作或其他源(例如单击鼠标或按下按键)而发生的操作。事件处理程序是用于处理事件的例程,允许程序员编写在事件发生时执行的代码。

在某些情况下(例如,在保存文件之前), Katana会触发回调,并且调用代码会在继续之前等待执行回调,例如允许用户在保存项目之前对其进行修改。

相反,事件会排队并由Katana的事件系统“稍后”处理。这意味着回调更加即时,但通常也应该非常快,否则可能会在工作时冻结 UI。

回调和事件处理程序在许多情况下都很有用,例如,在创建新的Katana项目时更改项目设置或对某些节点参数的值更改做出反应。

回调

Katana中,回调可用于不同的情况,例如正在启动的软件、正在加载的Katana项目或正在创建的节点。要查看可用回调的完整列表,请在 Python 选项卡中运行以下代码:

from Katana import Callbacks
print(dir(Callbacks.Type))


要找出传递给每个回调类型的关键字参数,您可以注册以下回调,该回调将在调用时打印输入参数:

def Hello(**kwargs):
for i in kwargs.keys():
print(i)


可以在回调函数中访问这些参数,例如如下:

def Hello(**kwargs):
   print(kwargs.get('filename'))

from Katana import Callbacks Callbacks.addCallback(Callbacks.Type.onSceneLoad, Hello)

事件处理程序

Katana中有许多不同的事件类型可供注册处理程序监听。要查看所有可用事件类型的列表,请在 Python 选项卡中运行以下命令:

 from Katana import Utils
print ( sorted ( Utils . EventModule . GetAllRegisteredEventTypes ()))

要查找每种事件类型存在哪些输入参数,您可以为特定事件注册以下处理程序。当事件被触发时,处理程序将打印出参数。以下是打印“node_create”事件类型的输入参数的示例:

def node_CreateCallback(eventType, eventID, **kwargs):
    for i in kwargs.keys():
        print(i)

Utils.EventModule.RegisterEventHandler(node_CreateCallback, 'node_create')


一旦知道输入参数,就可以在事件处理函数中使用它们。以下是一个示例事件处理程序,可以注册它来侦听用户首选项的更改,并将打印出首选项的名称及其新值:

def PrefChangedCallback(eventType, eventID, prefKey, prefValue):
    print(prefKey, "preference changed to:", prefValue)

Utils.EventModule.RegisterEventHandler(PrefChangedCallback, 'pref_changed')

节点参数更改的事件处理程序

例如,如果事件处理函数仅对特定节点参数的更改做出反应,则可以将其注册为侦听“ parameter_finalizeValue ”事件。可以在处理函数中检查已更改参数的名称,以确定它是否是相关的:

def myParamCallback(eventType, eventID, node, param):
    if (node.getName() == "CameraCreate") and (param.getName() == 'fov'):
        print("FOV for the following camera changed to " + repr(param.getValue(0)) + ": " + node.getParameter('name').getValue(0))

Utils.EventModule.RegisterEventHandler(myParamCallback, "parameter_finalizeValue")

事件处理程序不一定在事件排队后立即执行。如果任何代码依赖于已处理的特定事件并执行事件处理程序,则可能需要调用以下命令:

Utils.EventModule.ProcessAllEvents() 


有关回调和事件处理程序的更多信息,另请参阅Katana开发人员指南 的回调和事件部分

Katana启动时注册回调或事件处理程序

Katana启动时可以自动注册回调或事件处理程序,如下所示:

  • 定义您希望回调或事件处理函数在单个 Python 函数中执行的所有操作,并注册它,如下面的示例代码所示:
from Katana import Utils, Callbacks

def PrefChangedCallback(eventType, eventID, prefKey, prefValue):
    print(prefKey, "preference changed to:", prefValue)

Utils.EventModule.RegisterEventHandler(PrefChangedCallback, 'pref_changed')
def Hello(**kwargs): print(kwargs.get('filename'))
Callbacks.addCallback(Callbacks.Type.onSceneLoad, Hello) 

  • 将其复制并粘贴到文本编辑器中,然后保存文件。

  • 将文件重命名为 init.py 并确保文件扩展名显示在文件浏览器中,这是为了验证文件扩展名是 .py 而不是 .txt 或不同。

  • 将文件放置在 .katana 文件夹中或$KATANA_RESOURCES环境变量中定义的路径下的Startup文件夹中。


有关KATANA的更多信息,请参阅Katana安装指南中的相应主题。

下次启动Katana时,将在发生指定操作时执行回调函数,并在相关事件排队并处理时执行事件处理函数。在上面的示例中,当更改首选项或加载Katana项目时,新的首选项值或项目文件路径将分别打印到终端。

进一步的帮助

有关回调和事件处理程序的更多信息,请参阅Katana开发人员指南的回调和事件部分。

如果您在设置回调或事件处理程序时遇到任何问题,请打开支持票证并让我们了解该问题以及您迄今为止采取的故障排除步骤。


有关如何开具支持票证的更多信息,请参阅Q100064:如何提出支持票证

    我们很遗憾听到

    请告诉我们