系统托盘
from uda import Uda
with Uda() as uda: menu = uda.create_tray_menu() menu.add_text("设置", lambda: print("打开设置")) menu.add_separator() menu.add_text("退出", lambda: raise SystemExit(0))
icon = uda.create_tray_icon("我的应用", tooltip="我的应用正在运行") icon.menu = menu
icon.wait() # 阻塞直到 stop() 或 destroy()Node.js 侧:
const { Uda } = require('./uda');
const uda = new Uda();const menu = uda.createTrayMenu();menu.addText('设置', () => console.log('打开设置'));menu.addSeparator();
const icon = uda.createTrayIcon('我的应用', { tooltip: '我的应用正在运行' });icon.menu = menu;await icon.wait();icon.destroy();跨平台统一,两侧能力一致:
| 行类型 | Python | Node.js |
|---|---|---|
| 文本项 | menu.add_text(label, callback) |
menu.addText(label, callback) |
| 复选框 | menu.add_checkbox(label, checked, callback) |
menu.addCheckbox(label, checked, callback) |
| 分隔线 | menu.add_separator() |
menu.addSeparator() |
回调签名:
- 文本项:
callback() - 复选框:
callback(checked: bool),其中checked是点击后的新状态
| 平台 | 协议 |
|---|---|
| Linux | org.kde.StatusNotifierItem(SNI)+ com.canonical.dbusmenu |
| Windows | Shell_NotifyIconW(NOTIFYICON_VERSION_4)+ 自建弹出菜单 |
图标:传路径即可
Section titled “图标:传路径即可”icon.icon = "icons/UniDesktop_3D_transparent_mini.png"SDK 内部会解码 PNG(含逐行反滤波、调色板展开、非 8 位深扩展)、按目标尺寸降采样、按需做通道对齐,然后经 uda_tray_set_icon_rgba 提交像素。
生命周期:stop / wait / destroy
Section titled “生命周期:stop / wait / destroy”| 方法 | 作用 |
|---|---|
icon.wait() |
阻塞当前线程,直到 stop() 或 destroy() 被调用 |
icon.stop() |
让 wait() 返回,但不注销图标(图标仍在托盘) |
icon.destroy() |
从托盘注销并销毁句柄,wait() 随之返回 |
典型模式:
icon = uda.create_tray_icon("我的应用")try: icon.wait()finally: icon.destroy()配合菜单项退出:
def quit(): icon.stop() # 让 wait() 返回,finally 里再 destroy
menu.add_text("退出", quit)icon.menu = menuicon.wait()icon.destroy()icon.visible = False # 隐藏但不注销icon.visible = True # 恢复TrayIcon 与 TrayMenu 都实现了 Drop / Symbol.dispose,退出 with 块时自动注销;忘记释放时 __del__ / dispose 会兜底。Uda.release_all() 可一次性释放本对象持有的全部托盘资源与常亮锁。
- StatusNotifierItem(SNI)——Linux 侧协议,含
IconPixmap字节序 - DBusMenu——以整数 id 定位的菜单树
- Shell_NotifyIconW——Windows 侧实现
