4. 自定义菜单栏

任务说明

在 Omniverse Kit 应用中,通过扩展(Extension)的方式在现有菜单栏中新增一个自定义顶级菜单“My Tools”,并在其下添加两个子菜单项“Print Message”和“Open Dialog”。点击子菜单时分别触发对应的回调函数,实现菜单交互功能。

实现方案

本案例基于 Omniverse Kit 的扩展机制,在扩展的 on_startup() 阶段获取 ui_menu 接口,注册自定义菜单及回调。核心逻辑位于扩展的 Python 文件中,通过 carb 与 omni.kit.ui 模块完成菜单注册。

代码实现

# 文件: custom_menu_extension.py
import carb
import omni.kit.app
import omni.kit.ui

class CustomMenuExtension:
    def __init__(self):
        self._menu = None

    def on_startup(self):
        """扩展启动时注册菜单"""
        editor_menu = omni.kit.ui.get_editor_menu()
        if editor_menu is None:
            carb.log_error("无法获取编辑器菜单接口")
            return

        # 创建顶级菜单
        self._menu = editor_menu.add_menu("My Tools")
        if self._menu is None:
            carb.log_error("创建顶级菜单失败")
            return

        # 添加子菜单项并绑定回调
        self._menu.add_item("Print Message", lambda: self._on_print_message())
        self._menu.add_item("Open Dialog", lambda: self._on_open_dialog())

    def on_shutdown(self):
        """扩展关闭时清理菜单"""
        if self._menu is not None:
            omni.kit.ui.get_editor_menu().remove_menu("My Tools")
            self._menu = None

    def _on_print_message(self):
        """回调1:打印消息到控制台"""
        carb.log_info("自定义菜单被点击:Print Message")

    def _on_open_dialog(self):
        """回调2:弹出简单对话框"""
        from omni.kit.window.dialog import Dialog
        dialog = Dialog("提示", "这是一个自定义菜单触发的对话框")
        dialog.show()

# 扩展入口
extension_obj = None

def on_startup(ext_id):
    global extension_obj
    extension_obj = CustomMenuExtension()
    extension_obj.on_startup()

def on_shutdown(ext_id):
    global extension_obj
    if extension_obj:
        extension_obj.on_shutdown()
        extension_obj = None

扩展配置

# 文件: extension.toml
[package]
name = "custom-menu-extension"
version = "1.0.0"
description = "在菜单栏添加自定义菜单和子菜单,并绑定回调函数"

[python]
module_name = "custom_menu_extension"

[omni.kit]
version = ">=0.1.0"

[[omni.kit.ext]]
id = "omni.kit.ui"

落地方式

  1. 在 Omniverse Kit 的扩展搜索路径中创建目录 custom_menu_extension/,将上述两个文件放入其中。
  2. 启动 Omniverse Kit 应用,打开 Extension Manager(Window → Extensions)。
  3. 在搜索框中输入 custom-menu-extension,找到后点击 Enable 启用该扩展。

验证方法

  1. 扩展启用后,观察菜单栏顶部是否出现 My Tools 菜单。
  2. 点击 My Tools → Print Message,打开 Console 窗口(Window → Console),应看到日志输出:自定义菜单被点击:Print Message。
  3. 点击 My Tools → Open Dialog,应弹出标题为“提示”、内容为“这是一个自定义菜单触发的对话框”的对话框窗口。
  4. 在 Extension Manager 中禁用该扩展,确认 My Tools 菜单从菜单栏消失。

判定标准:上述 4 个步骤全部符合预期,即表示自定义菜单栏功能实现正确。

菜单注册与回调触发流程 on_startup() 扩展启用时执行 get_editor_menu() 获取编辑器菜单栏接口 add_menu("My Tools") 创建顶级菜单 File Edit Window My Tools Print Message Open Dialog 点击触发 回调函数执行 log_info / Dialog 弹出 验证观测点 Console日志 / 对话框显示