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"
落地方式
- 在 Omniverse Kit 的扩展搜索路径中创建目录
custom_menu_extension/,将上述两个文件放入其中。 - 启动 Omniverse Kit 应用,打开 Extension Manager(Window → Extensions)。
- 在搜索框中输入
custom-menu-extension,找到后点击 Enable 启用该扩展。
验证方法
- 扩展启用后,观察菜单栏顶部是否出现 My Tools 菜单。
- 点击 My Tools → Print Message,打开 Console 窗口(Window → Console),应看到日志输出:
自定义菜单被点击:Print Message。 - 点击 My Tools → Open Dialog,应弹出标题为“提示”、内容为“这是一个自定义菜单触发的对话框”的对话框窗口。
- 在 Extension Manager 中禁用该扩展,确认 My Tools 菜单从菜单栏消失。
判定标准:上述 4 个步骤全部符合预期,即表示自定义菜单栏功能实现正确。