API 参考

JadeUI Python SDK 提供了一套完整的 API 用于创建桌面应用。本文档详细介绍各个类和方法。

JadeUIApp

主应用类,管理应用生命周期。采用单例模式。

构造函数

Python
app = JadeUIApp()

方法

initialize()

初始化应用。

Python
app.initialize(
    enable_dev_tools=False,  # 是否启用开发者工具 (F12)
    log_file=None,           # 日志文件路径
    data_directory=None,     # WebView 数据目录
    app_name=None,           # 应用名称 (JadeView 2.x)
    app_signature=None,      # 应用签名,占位值至少 6 个字符 (JadeView 2.x)
    single_instance=False,   # 单实例模式 (JadeView 2.x)
)
参数类型描述
enable_dev_toolsbool启用开发者工具
log_filestr | None日志文件路径
data_directorystr | NoneWebView 数据存储目录
app_namestr | None应用名称;未传入时 SDK 自动生成
app_signaturestr | None应用签名;JadeView 2.x 要求非空且 trim 后不少于 6 个字符,SDK 会自动补足缺省值
single_instancebool是否启用单实例模式

返回值: JadeUIApp (支持链式调用)

run()

启动应用消息循环。此方法会阻塞直到所有窗口关闭。

Python
app.run()

quit()

退出应用。

Python
app.quit()

is_ready()

检查应用是否已初始化。

Python
if app.is_ready():
    print("应用已就绪")

返回值: bool

get_webview_version()

获取 WebView 引擎版本。

Python
version = app.get_webview_version()
print(f"WebView 版本: {version}")  # 例如: "120.0.2210.144"

返回值: str | None - WebView 版本字符串,如果不可用则返回 None

装饰器

@on_ready

注册应用就绪事件处理器。

Python
@app.on_ready
def setup():
    window = Window("My App")
    window.show()

@on_window_all_closed

注册所有窗口关闭事件处理器。

Python
@app.on_window_all_closed
def cleanup():
    print("所有窗口已关闭")

事件

事件名描述
ready应用初始化完成
error发生错误
window-all-closed所有窗口关闭
before-quit应用即将退出

Window

WebView 窗口类,用于创建和管理窗口。

构造函数

Python
window = Window(
    title="Window",          # 窗口标题
    width=800,               # 宽度
    height=600,              # 高度
    url=None,                # 初始 URL
    **options                # 其他选项
)

窗口选项

选项类型默认值描述
resizableboolTrue允许调整大小
remove_titlebarboolFalse移除原生标题栏
transparentboolFalse启用窗口透明
background_colorRGBA(255,255,255,255)背景颜色
always_on_topboolFalse窗口置顶
themestr"System"主题 (Light/Dark/System)
maximizedboolFalse初始最大化
maximizableboolTrue允许最大化
minimizableboolTrue允许最小化
xint-1X 坐标 (-1 居中)
yint-1Y 坐标 (-1 居中)
min_widthint0最小宽度
min_heightint0最小高度
max_widthint0最大宽度 (0 无限制)
max_heightint0最大高度 (0 无限制)
fullscreenboolFalse全屏模式
focusboolTrue创建时获取焦点
hide_windowboolFalse创建时隐藏
use_page_iconboolTrue使用页面图标
frame_stylestr | NoneNoneJadeView 2.x 窗口框架样式:normal / no-titlebar / borderless / title-overlay
auto_save_stateboolFalse自动保存窗口状态
skip_taskbarboolFalsev2.3:不显示在任务栏 / Alt-Tab
no_activateboolFalsev2.3:显示或点击时不抢焦点
autoplayboolFalse允许媒体自动播放
disable_right_clickboolFalse禁用右键菜单
user_agentstr | NoneNone自定义 User-Agent
preload_jsstr | NoneNone预加载 JavaScript
allow_fullscreenboolTrue允许页面 JS 调用全屏 API (需 Jadeui 0.2.1)
borderlessboolFalse无边框模式,移除边框和系统阴影 (需 0.2.1+)
content_protectionboolFalse内容保护,防止截屏/录屏 (需 1.1+)
postmessage_whiteliststr | NoneNonePostMessage 白名单,逗号分隔的源地址 (需 1.0.2+)

生命周期方法

show()

显示窗口。

Python
window.show(url=None)  # 可选传入 URL

返回值: Window (链式调用)

hide()

隐藏窗口。

Python
window.hide()

返回值: Window

close()

关闭窗口。

Python
window.close()

focus()

使窗口获取焦点。

Python
window.focus()

返回值: Window

状态控制方法

minimize()

最小化窗口。

Python
window.minimize()

返回值: Window

maximize()

切换最大化/还原状态。

Python
window.maximize()

返回值: Window

restore()

从最小化/最大化状态还原。

Python
window.restore()

返回值: Window

set_fullscreen()

设置全屏模式。

Python
window.set_fullscreen(True)   # 进入全屏
window.set_fullscreen(False)  # 退出全屏
参数类型描述
fullscreenbool是否全屏

返回值: Window

toggle_fullscreen()

切换全屏模式。如果当前是全屏则退出,否则进入全屏。

Python
window.toggle_fullscreen()

返回值: Window

属性方法

set_title()

设置窗口标题。

Python
window.set_title("New Title")
# 或使用属性
window.title = "New Title"

返回值: Window

set_size()

设置窗口大小。

Python
window.set_size(1280, 720)
参数类型描述
widthint宽度 (像素)
heightint高度 (像素)

返回值: Window

set_min_size()

设置最小窗口大小。

Python
window.set_min_size(400, 300)

返回值: Window

set_max_size()

设置最大窗口大小。

Python
window.set_max_size(1920, 1080)  # 0 表示无限制

返回值: Window

set_position()

设置窗口位置。

Python
window.set_position(100, 100)
参数类型描述
xintX 坐标
yintY 坐标

返回值: Window

center()

将窗口居中显示。

Python
window.center()

返回值: Window

set_visible()

设置窗口可见性。

Python
window.set_visible(True)
window.set_visible(False)

返回值: Window

set_always_on_top()

设置窗口置顶。

Python
window.set_always_on_top(True)

返回值: Window

set_resizable()

设置是否可调整大小。

Python
window.set_resizable(False)

返回值: Window

set_skip_taskbar()

设置窗口是否不显示在任务栏 / Alt-Tab 中。需要 JadeView 2.3+。

Python
window.set_skip_taskbar(True)
window.set_skip_taskbar(False)

返回值: Window

set_no_activate()

设置窗口显示或点击时是否不抢焦点。需要 JadeView 2.3+。

Python
window.set_no_activate(True)
window.set_no_activate(False)

返回值: Window

set_level()

设置窗口层级。需要 JadeView 2.3+。

Python
window.set_level("topmost")  # topmost / normal / bottom / desktop
参数类型描述
levelstrtopmostnormalbottomdesktop

返回值: Window

主题方法

set_theme()

设置窗口主题。

Python
from jadeui import Theme

window.set_theme(Theme.LIGHT)  # 浅色
window.set_theme(Theme.DARK)   # 深色
window.set_theme(Theme.SYSTEM) # 跟随系统

返回值: Window

get_theme()

获取当前主题。

Python
theme = window.get_theme()

返回值: str

set_backdrop()

设置窗口背景材料 (Windows 11)。

Python
from jadeui import Backdrop

window.set_backdrop(Backdrop.MICA)     # Mica 效果
window.set_backdrop(Backdrop.MICA_ALT) # Mica Alt 效果
window.set_backdrop(Backdrop.ACRYLIC)  # Acrylic 效果

返回值: Window

WebView 方法

load_url() / navigate()

导航到 URL。

Python
window.load_url("https://example.com")
# 或
window.navigate("https://example.com")

返回值: Window

execute_js() / eval()

执行 JavaScript 代码。

Python
window.execute_js("console.log('Hello!')")
# 或
window.eval("document.title = 'New Title'")

返回值: Window

reload()

重新加载当前页面。

Python
window.reload()

返回值: Window

状态属性

属性类型描述
idint | None窗口 ID
titlestr窗口标题
sizetuple[int, int]窗口大小 (width, height)
positiontuple[int, int]窗口位置 (x, y)
is_visiblebool是否可见
is_maximizedbool是否最大化 (需 Jadeui 0.2.1)
is_minimizedbool是否最小化
is_focusedbool是否获得焦点
is_fullscreenbool是否全屏 (需 Jadeui 0.2.1)

原生句柄

get_hwnd()

获取窗口的原生 HWND。JadeView 2.3 起,普通 create_webview_window 创建的窗口也可返回有效句柄。

Python
hwnd = window.get_hwnd()

返回值: int

静态方法

get_window_count()

获取活动窗口数量。

Python
count = Window.get_window_count()

get_window_by_id()

通过 ID 获取窗口。

Python
window = Window.get_window_by_id(1)

get_id_from_hwnd()

根据原生 HWND 反查 JadeView window id。需要 JadeView 2.3+。

Python
window_id = Window.get_id_from_hwnd(hwnd)

get_all_windows()

获取所有活动窗口。

Python
windows = Window.get_all_windows()

事件

Window 类提供两种事件监听方式:类型化装饰器(推荐)和 Events 常量

事件参数已自动解析,不需要手动 json.loads

类型化事件装饰器(推荐)

提供 IDE 类型提示,参数已自动解析:

装饰器回调签名描述
@window.on_resized(width: int, height: int)窗口大小改变
@window.on_moved(x: int, y: int)窗口位置改变
@window.on_focused()窗口获得焦点
@window.on_blurred()窗口失去焦点
@window.on_closing() -> bool窗口即将关闭,返回 True 阻止
@window.on_state_changed(is_maximized: bool)窗口状态改变
@window.on_fullscreen_changed(is_fullscreen: bool)全屏状态改变 (需 1.2+)
@window.on_file_dropped(files: List[str], x: int, y: int)文件拖放
@window.on("drag-drop")(data: dict)v2.x 底层拖拽生命周期事件
@window.on_navigate(url: str) -> bool即将导航,返回 True 阻止
@window.on_page_loaded(url: str)页面加载完成
@window.on_title_updated(title: str)页面标题更新
@window.on_new_window(url: str, frame_name: str) -> bool新窗口请求,返回 True 阻止
@window.on_download_started(url: str, filename: str) -> bool下载开始,返回 True 阻止 (需 0.3.1+)

示例

Python
from jadeui import Window

window = Window(title="事件示例")

@window.on_resized
def handle_resize(width: int, height: int):
    print(f"窗口大小: {width} x {height}")

@window.on_moved
def handle_move(x: int, y: int):
    print(f"窗口位置: ({x}, {y})")

@window.on_focused
def handle_focus():
    print("窗口获得焦点")

@window.on_closing
def handle_closing():
    if has_unsaved_changes:
        return True  # 阻止关闭
    return False

@window.on_page_loaded
def handle_loaded(url: str):
    print(f"页面加载完成: {url}")

window.show()

Events 常量方式

也可以使用 Events 常量,参数同样已自动解析:

事件常量事件名回调参数描述
Events.WINDOW_RESIZEDwindow-resized(width, height)大小改变
Events.WINDOW_MOVEDwindow-moved(x, y)位置改变
Events.WINDOW_FOCUSEDwindow-focused()获得焦点
Events.WINDOW_BLURREDwindow-blurred()失去焦点
Events.WINDOW_CLOSINGwindow-closing()即将关闭(返回 1 可阻止)
Events.WINDOW_STATE_CHANGEDwindow-state-changed(is_maximized,)状态改变
Events.WINDOW_FULLSCREENwindow-fullscreen(is_fullscreen,)全屏状态改变 (需 1.2+)
Events.FILE_DROPfile-drop(files, x, y)文件拖放
Events.WEBVIEW_WILL_NAVIGATEwebview-will-navigate(url,)即将导航
Events.WEBVIEW_DID_FINISH_LOADwebview-did-finish-load(url,)加载完成
Events.WEBVIEW_NEW_WINDOWwebview-new-window(url, frame_name)新窗口请求
Events.WEBVIEW_PAGE_TITLE_UPDATEDwebview-page-title-updated(title,)标题更新
Events.FAVICON_UPDATEDfavicon-updated(favicon,)图标更新
Events.WEBVIEW_DOWNLOAD_STARTEDwebview-download-started(url, filename)下载开始 (需 0.3.1+)

示例

Python
from jadeui import Window, Events

window = Window(title="事件示例")

# 参数已自动解析,不需要 json.loads
@window.on(Events.WINDOW_RESIZED)
def on_resize(width: int, height: int):
    print(f"窗口大小: {width} x {height}")

@window.on(Events.WEBVIEW_DID_FINISH_LOAD)
def on_page_load(url: str):
    print(f"页面加载完成: {url}")

window.show()

内部事件

事件名回调参数描述
createdWindow窗口创建完成
closed-窗口已关闭
page-loadedurl, status页面加载完成

drag-drop / file-drop 事件详解

JadeView 2.x 底层事件名为 drag-drop,会在 enteroverdropleave 阶段触发。SDK 仍保留 file-drop / on_file_dropped 作为兼容封装,只在最终 drop 阶段触发。

回调参数

参数类型描述
filesList[str]拖放的文件路径列表
xint拖放位置的 X 坐标
yint拖放位置的 Y 坐标

示例

Python
from jadeui import Window

window = Window(title="文件拖放示例")

@window.on_file_dropped
def on_file_drop(files: list, x: int, y: int):
    print(f"拖放了 {len(files)} 个文件到位置 ({x}, {y})")
    for file_path in files:
        print(f"  - {file_path}")

window.show()
Python
@window.on("drag-drop")
def on_drag_drop(data):
    print(data["type"], data.get("paths", []))
    # JadeView 2.3 起,enter/drop 阶段返回 True 或非空字符串可同步拦截/消费
    return False

download-started 事件详解

webview-download-started 事件在 WebView 中开始下载文件时触发。

回调参数

参数类型描述
urlstr下载文件的 URL
filenamestr建议的文件名

返回值

  • 返回 True1:阻止下载
  • 返回 False0None:允许下载(默认行为)

示例

Python
from jadeui import Window

window = Window(title="下载事件示例")

@window.on_download_started
def on_download(url: str, filename: str):
    print(f"下载请求: {filename}")
    print(f"来源: {url}")
    
    # 阻止可执行文件下载
    if filename.endswith((".exe", ".msi", ".bat")):
        print("已阻止可执行文件下载")
        return True
    
    # 阻止来自不信任域名的下载
    if "untrusted-site.com" in url:
        return True
    
    return False  # 允许下载

window.show()

IPCManager

IPC 通信管理器,处理 Python 后端与 Web 前端的通信。

构造函数

Python
ipc = IPCManager()

方法

register_handler()

注册消息处理器。

Python
def handler(window_id: int, message: str) -> int:
    print(f"收到: {message}")
    return 1

ipc.register_handler("channel-name", handler)
参数类型描述
channelstr通道名称
handlerCallable处理函数

send()

发送消息到窗口。

Python
ipc.send(window_id, "channel-name", "message content")
参数类型描述
window_idint目标窗口 ID
channelstr通道名称
messagestr消息内容

remove_handler()

移除消息处理器。

Python
ipc.remove_handler("channel-name")

list_handlers()

列出所有注册的通道。

Python
channels = ipc.list_handlers()

返回值: list[str]

装饰器

@on()

装饰器方式注册处理器。

Python
@ipc.on("greet")
def handle_greet(window_id, message):
    print(f"收到: {message}")
    ipc.send(window_id, "response", "Hello!")
    return 1

LocalServer

本地 HTTP 服务器,用于托管 Web 内容。

构造函数

Python
server = LocalServer()

方法

start()

启动服务器。

Python
url = server.start(
    app_name="myapp",    # 兼容保留,JadeView 2.x 底层不再使用
    root_path="./web",   # 静态根目录
    hot_reload=False,    # 是否启用热重载(JAPK 文件上会强制关闭)
    japk=None,           # 可选:.japk 路径(优先于 root_path)
    from_memory=False,   # True:配合已内存加载的 JAPK(见 jadeui.japk.Japk)
)
print(f"服务器运行在: {url}")
参数类型描述
root_pathstr静态文件根目录
app_namestr应用标识符
hot_reloadbool是否启用热重载
japkstr | None.japk 文件路径;提供时覆盖 root_path
from_memorybool已通过内存加载 JAPK 时设为 True

返回值: str - 服务器 URL

stop()

停止服务器。

Python
server.stop()

get_url()

获取文件的完整 URL。

Python
url = server.get_url("index.html")

返回值: str

属性

属性类型描述
is_runningbool服务器是否运行中
urlstr | None服务器 URL

Router

后端主导的路由系统,支持内置模板和自定义模板。

构造函数

Python
router = Router(ipc=None)  # 可传入 IPCManager 实例

方法

page()

注册页面路由。

Python
router.page(
    path="/",                    # 路由路径
    template="pages/home.html",  # 模板文件
    title="首页",                # 页面标题
    icon="🏠",                   # 图标 (侧边栏显示)
    show_in_nav=True,            # 是否显示在导航栏
)
参数类型默认值描述
pathstr-路由路径,支持参数 (如 /user/:id)
templatestr-模板文件路径
titlestr"Page"页面标题
iconstr""页面图标
show_in_navboolTrue是否在导航中显示

返回值: Router (链式调用)

mount()

挂载路由器并创建窗口。

Python
window = router.mount(
    title="My App",          # 窗口标题
    web_dir="web",           # Web 文件目录
    width=1024,              # 窗口宽度
    height=768,              # 窗口高度
    sidebar_width=220,       # 侧边栏宽度
    theme="system",          # 主题
    initial_path="/",        # 初始路由
    template=None,           # 自定义模板 (None 使用内置)
    head_links=[],           # 额外 CSS 链接
    scripts=[],              # 额外 JS 脚本
    **window_options         # 其他窗口选项
)

返回值: Window

go()

导航到指定路由。

Python
router.go("/settings")
router.go("/user/123")  # 带参数

返回值: bool - 是否成功

set_theme()

设置应用主题。

Python
router.set_theme("light")  # light, dark, system

set_backdrop()

设置窗口背景材料。

Python
router.set_backdrop("mica")  # mica, micaAlt, acrylic

属性

属性类型描述
current_routestr当前路由路径
windowWindow | None关联的窗口实例

Dialog

对话框 API,提供文件选择、保存和消息框功能。

方法

show_open_dialog()

显示打开文件对话框。

Python
from jadeui import Dialog

# 阻塞模式(默认)
Dialog.show_open_dialog(
    window_id=1,
    title="选择图片",
    default_path="C:/",
    filters=[
        {"name": "图片", "extensions": ["png", "jpg", "gif"]},
        {"name": "所有文件", "extensions": ["*"]}
    ],
    properties=["openFile", "multiSelections"]
)

# 非阻塞模式 + 回调
def on_result(result):
    print(f"选中: {result}")

Dialog.show_open_dialog(
    window_id=1,
    title="选择文件",
    properties=["openFile"],
    blocking=False,
    callback=on_result
)
参数类型描述
window_idint父窗口 ID
titlestr | None对话框标题
default_pathstr | None默认打开路径
button_labelstr | None确认按钮的自定义标签
filterslist | None文件过滤器,如 [{"name": "图片", "extensions": ["png", "jpg"]}]
propertieslist | None对话框属性:openFile, openDirectory, multiSelections, showHiddenFiles
blockingbool是否阻塞(默认 True)
callbackCallable回调函数(非阻塞模式使用)

返回值: int - 1 成功,0 失败

show_save_dialog()

显示保存文件对话框。

Python
Dialog.show_save_dialog(
    window_id=1,
    title="保存文档",
    default_path="document.txt",
    filters=[{"name": "文本文件", "extensions": ["txt"]}]
)
参数类型描述
window_idint父窗口 ID
titlestr | None对话框标题
default_pathstr | None默认保存路径/文件名
button_labelstr | None确认按钮的自定义标签
filterslist | None文件过滤器
blockingbool是否阻塞(默认 True)
callbackCallable回调函数(非阻塞模式使用)

返回值: int - 1 成功,0 失败

show_message_box()

显示消息框。

Python
Dialog.show_message_box(
    window_id=1,
    title="确认删除",
    message="确定要删除这个文件吗?",
    detail="此操作不可撤销",
    type_="warning",
    buttons=["删除", "取消"],
    default_id=1,
    cancel_id=1
)
参数类型描述
window_idint父窗口 ID
titlestr | None消息框标题
messagestr | None消息内容
detailstr | None详细信息
buttonslist | None按钮文本列表,如 ["确定", "取消"]
default_idint默认选中的按钮索引
cancel_idint取消按钮的索引(按 ESC 时触发)
type_str消息类型:none, info, error, warning, question
blockingbool是否阻塞(默认 True)
callbackCallable回调函数(非阻塞模式使用)

返回值: int - 1 成功,0 失败

show_error_box()

显示错误框(简化版)。

Python
Dialog.show_error_box(1, "错误", "文件读取失败!")

便捷方法

confirm()

显示确认对话框。

Python
Dialog.confirm("确定要退出吗?")
Dialog.confirm("删除文件?", title="确认", ok_label="删除", cancel_label="取消")

alert()

显示提示对话框。

Python
Dialog.alert("操作成功!")
Dialog.alert("请注意!", type_="warning")

error()

显示错误对话框。

Python
Dialog.error("文件保存失败!")

常量

MessageBoxType

消息框类型常量。

Python
from jadeui import MessageBoxType

MessageBoxType.NONE      # "none"
MessageBoxType.INFO      # "info"
MessageBoxType.WARNING   # "warning"
MessageBoxType.ERROR     # "error"
MessageBoxType.QUESTION  # "question"

OpenDialogProperties

打开对话框属性常量。

Python
from jadeui import OpenDialogProperties

OpenDialogProperties.OPEN_FILE         # "openFile"
OpenDialogProperties.OPEN_DIRECTORY    # "openDirectory"
OpenDialogProperties.MULTI_SELECTIONS  # "multiSelections"
OpenDialogProperties.SHOW_HIDDEN_FILES # "showHiddenFiles"

Notification

桌面通知 API,支持 Windows 系统通知。

方法

config()

配置通知应用信息(可选,有默认值)。

Python
from jadeui import Notification

Notification.config(
    app_name="我的应用",
    icon="C:/path/to/icon.ico"  # 绝对路径
)
参数类型描述
app_namestr | None应用显示名称(默认 "JadeUI App")
iconstr | None应用图标路径(绝对路径)

show()

显示简单通知(无按钮)。

Python
Notification.show("提示", "操作已完成")
Notification.show("下载中", "正在下载文件...", timeout=5000)
参数类型描述
titlestr通知标题(必填)
bodystr | None通知内容
iconstr | None图标路径(覆盖 config 设置)
timeoutint超时时间(毫秒,≤ 0 使用默认)

返回值: bool - 显示成功返回 True

with_buttons()

显示带按钮的通知(最多两个按钮)。

Python
Notification.with_buttons(
    "下载完成",
    "video.mp4 已下载",
    "打开",       # 第一个按钮
    "忽略",       # 第二个按钮(可选)
    action="download_123"  # 动作标识符
)
参数类型描述
titlestr通知标题
bodystr通知内容
button1str第一个按钮文本
button2str | None第二个按钮文本(可选)
iconstr | None图标路径
timeoutint超时时间
actionstr | None动作标识符,用于在回调中识别通知

返回值: bool - 显示成功返回 True

on()

注册通知事件监听器。

Python
from jadeui import Notification, Events

@Notification.on(Events.NOTIFICATION_ACTION)
def on_action(data):
    # data = {
    #     "action": "action_0",      # 按钮索引
    #     "title": "打开",           # 按钮文本
    #     "arguments": "download_123" # 你传入的 action 参数
    # }
    print(f"按钮点击: {data}")

@Notification.on(Events.NOTIFICATION_DISMISSED)
def on_dismissed(data):
    print("通知被关闭")

支持的事件:

事件描述
Events.NOTIFICATION_ACTION用户点击通知按钮
Events.NOTIFICATION_SHOWN通知成功显示
Events.NOTIFICATION_DISMISSED通知被关闭
Events.NOTIFICATION_FAILED通知显示失败

便捷方法

Python
Notification.info("标题", "内容")
Notification.success("标题", "内容")
Notification.warning("标题", "内容")
Notification.error("标题", "内容")

完整示例

Python
from jadeui import Notification, Events

# 1. 配置应用信息
Notification.config(app_name="我的应用", icon="C:/app/icon.ico")

# 2. 监听按钮点击事件
@Notification.on(Events.NOTIFICATION_ACTION)
def on_action(data):
    action_id = data.get("arguments")  # 获取 action 参数
    button = data.get("action")        # 按钮索引

    if action_id == "download_123":
        if button == "action_0":
            print("用户点击了「打开」")
        elif button == "action_1":
            print("用户点击了「忽略」")

# 3. 发送通知
Notification.with_buttons(
    "下载完成",
    "video.mp4 已下载",
    "打开",
    "忽略",
    action="download_123"
)

Clipboard

系统剪贴板文本读写 API。需要 JadeView 2.x。

Python
from jadeui import Clipboard

Clipboard.write_text("Hello JadeUI")
text = Clipboard.read_text()
方法描述
Clipboard.write_text(text)写入文本,成功返回 True
Clipboard.read_text(buffer_size=65536)读取文本,失败或为空返回 None

System

系统信息与 v2.3 系统集成 API。

Python
from jadeui import System

print(System.is_windows_11())
print(System.locale())
print(System.displays())
print(System.get_path("desktop"))
print(System.jadeview_version())
print(System.webview_version())
方法描述
System.is_windows_11()当前系统是否为 Windows 11
System.locale()系统语言,如 zh-CN
System.displays()显示器信息列表
System.cursor_position()当前鼠标光标位置
System.get_path(name)获取系统路径,如 desktopdocumentsappdatatemp
System.webview_version()WebView2 Runtime 版本
System.jadeview_version()JadeView DLL 版本
System.set_login_autostart(enable=True, args=None)v2.3:设置开机自启
System.get_login_autostart()v2.3:查询开机自启状态
System.register_url_scheme(scheme, ...) / unregister_url_schemev2.3:注册 / 注销自定义 URL 协议
System.register_file_association(...)v2.3:注册文件关联
System.register_resource / unregister_resource / clear_window_resourcesv2.3:窗口级资源注册(TTL:None/0 默认,-1 永不过期)
System.printer_list() / System.print_file(...)v2.3:打印机列表与打印文件
System.clear_data_directory(confirm=True)v2.3:清理数据目录(需确认令牌 CLEAR_DATA_CONFIRM_TOKEN
System.convert_encoding / gbk_to_utf8 / utf8_to_gbkv2.3:编码转换
System.get_file_icon(path, size=48, window_id=0, ttl_seconds=0)v2.3:提取文件/目录图标,返回 jade:// URL
System.ntp_now(server=None)v2.3:获取 NTP UTC 毫秒时间戳,网络失败返回 None

原生右键菜单。推荐使用 Menu.attach_context_menu:在 context-menu 回调内才真正创建菜单项(符合官方流程)。

Python
from jadeui import Menu, Window

window = Window(title="Menu Demo", disable_right_click=False)

Menu.attach_context_menu(window, [
    {"label": "刷新", "on_click": lambda: window.reload()},
    {"type": "separator"},
    {"label": "copy", "type": "native"},  # WebView2 原生菜单 Name
    {
        "label": "更多",
        "type": "submenu",
        "children": [
            {"label": "关于", "on_click": lambda: print("about")},
        ],
    },
])

菜单项字段:label / on_click / typenormal | separator | checkbox | radio | submenu | native)/ children / disabled / checked / item_id

type="native" 时,label 应为 WebView2 原生菜单 Name(如 "copy""paste")。


Storage

YAML 持久化存储 API。需要 JadeView 2.3+,建议在 app.on_ready 后使用。

Python
from jadeui import Storage

Storage.set("settings", "window.width", 1024)
Storage.set_str("settings", "literal", "true")

print(Storage.get("settings", "window.width"))
print(Storage.get_all("settings", {}))
print(Storage.keys("settings", "window"))
print(Storage.length("settings", "window"))
方法描述
Storage.set(file_name, key_path, value)写入值;非字符串会序列化为 JSON
Storage.set_str(file_name, key_path, value)按字面字符串写入
Storage.get(file_name, key_path, default=None)读取路径值
Storage.get_str(file_name, key_path, default=None)按字面字符串读取(与 set_str 配对;"123" 保持字符串不被强转)
Storage.get_all(file_name, default=None)读取整个 YAML 文件
Storage.has(file_name, key_path)路径是否存在
Storage.delete(file_name, key_path)删除路径
Storage.clear(file_name)清空文件为 {}
Storage.delete_file(file_name)删除 YAML 文件
Storage.keys(file_name, key_path="")列出路径下 key
Storage.length(file_name, key_path="")返回对象 key 数或数组长度

Tray

系统托盘 API。需要 JadeView 2.x,通常在 app.on_ready 后创建。

Python
from jadeui import Tray

tray = Tray()
tray.set_tooltip("JadeUI App")
tray.set_icon("C:/app/icon.ico")
tray.set_menu([
    {"key": "show", "label": "显示窗口", "on_click": lambda: window.show()},
    {"type": "separator", "key": "sep"},
    {"key": "quit", "label": "退出", "dangerous": True, "on_click": app.quit},
])
tray.show()
方法描述
set_tooltip(text)设置悬浮提示
set_icon(icon_path)从文件设置托盘图标
set_icon_from_bytes(data)从内存字节设置托盘图标
set_menu(items)设置右键菜单
on_click(callback)监听托盘点击事件
show() / hide()显示或隐藏托盘
destroy()销毁托盘

HotKey

全局热键 API。需要 JadeView 2.x。

Python
from jadeui import HotKey

@HotKey.register("Ctrl+Alt+J")
def on_hotkey():
    window.flash(3)

hotkey_id = HotKey.register("Alt+F1", lambda: print("F1"))
HotKey.unregister(hotkey_id)
方法描述
HotKey.register(combo, callback=None)注册全局热键;可作为装饰器使用
HotKey.unregister(hotkey_id)注销指定热键
HotKey.unregister_all()注销全部热键

EventEmitter

事件发射器基类,提供事件订阅和发布功能。

方法

on()

注册事件监听器。

Python
# 方法形式
emitter.on("event", callback)

# 装饰器形式
@emitter.on("event")
def callback(data):
    pass

off()

移除事件监听器。

Python
emitter.off("event", callback)  # 移除特定监听器
emitter.off("event")            # 移除该事件所有监听器

emit()

触发事件。

Python
emitter.emit("event", arg1, arg2, key=value)

返回值: bool - 是否有监听器被调用

once()

注册一次性监听器。

Python
@emitter.once("event")
def callback():
    pass  # 只会被调用一次

remove_all_listeners()

移除所有监听器。

Python
emitter.remove_all_listeners("event")  # 特定事件
emitter.remove_all_listeners()         # 所有事件

listener_count()

获取监听器数量。

Python
count = emitter.listener_count("event")

event_names()

获取所有有监听器的事件名。

Python
names = emitter.event_names()

常量

Theme

窗口主题常量。

Python
from jadeui import Theme

Theme.LIGHT   # "Light"
Theme.DARK    # "Dark"
Theme.SYSTEM  # "System"

Backdrop

Windows 11 背景材料常量。

Python
from jadeui import Backdrop

Backdrop.MICA      # "mica"
Backdrop.MICA_ALT  # "micaAlt"
Backdrop.ACRYLIC   # "acrylic"

Events

标准事件名称常量。推荐使用这些常量而不是手写字符串,更加类型安全。

Python
from jadeui import Events

# 应用生命周期事件
Events.APP_READY          # "app-ready"
Events.WINDOW_ALL_CLOSED  # "window-all-closed"
Events.BEFORE_QUIT        # "before-quit"

# 窗口事件
Events.WINDOW_CREATED         # "window-created"
Events.APP_WINDOW_CREATED     # "app-window-created"
Events.WINDOW_CLOSED          # "window-closed"
Events.WINDOW_CLOSING         # "window-closing"
Events.WINDOW_RESIZED         # "window-resized"
Events.WINDOW_STATE_CHANGED   # "window-state-changed"
Events.WINDOW_FULLSCREEN      # "window-fullscreen" (需 1.2+)
Events.WINDOW_MOVED           # "window-moved"
Events.WINDOW_FOCUSED         # "window-focused"
Events.WINDOW_BLURRED         # "window-blurred"
Events.WINDOW_DESTROYED       # "window-destroyed"
Events.RESIZED                # "resized" (旧兼容格式)

# WebView 事件
Events.WEBVIEW_WILL_NAVIGATE      # "webview-will-navigate"
Events.WEBVIEW_DID_START_LOADING  # "webview-did-start-loading"
Events.WEBVIEW_DID_FINISH_LOAD    # "webview-did-finish-load"
Events.WEBVIEW_NEW_WINDOW         # "webview-new-window"
Events.WEBVIEW_PAGE_TITLE_UPDATED # "webview-page-title-updated"
Events.WEBVIEW_PAGE_ICON_UPDATED  # "webview-page-icon-updated"
Events.FAVICON_UPDATED            # "favicon-updated"
Events.JAVASCRIPT_RESULT          # "javascript-result"
Events.WEBVIEW_DOWNLOAD_STARTED   # "webview-download-started" (需 0.3.1+)
Events.POSTMESSAGE_RECEIVED       # "postmessage-received" (需 1.0.2+)

# 文件事件
Events.FILE_DROP          # "file-drop"

# 主题事件
Events.THEME_CHANGED      # "theme-changed"

# 通知事件 (需 1.3.0+)
Events.NOTIFICATION_ACTION    # "notification-action" (用户点击按钮)
Events.NOTIFICATION_SHOWN     # "notification-shown" (通知成功显示)
Events.NOTIFICATION_DISMISSED # "notification-dismissed" (通知被关闭)
Events.NOTIFICATION_FAILED    # "notification-failed" (通知显示失败)

# 其他事件
Events.UPDATE_WINDOW_ICON # "update-window-icon"
Events.IPC_MESSAGE        # "ipc-message"

使用类型化装饰器监听事件

Python
from jadeui import Window

window = Window(title="事件示例")

# 参数已自动解析,提供 IDE 类型提示
@window.on_resized
def on_resize(width: int, height: int):
    print(f"窗口大小改变: {width} x {height}")

@window.on_moved
def on_move(x: int, y: int):
    print(f"窗口位置: ({x}, {y})")

@window.on_focused
def on_focus():
    print("窗口获得焦点")

@window.on_blurred
def on_blur():
    print("窗口失去焦点")

@window.on_page_loaded
def on_page_load(url: str):
    print(f"页面加载完成: {url}")

# 阻止窗口关闭
@window.on_closing
def on_closing():
    return True  # 返回 True 阻止关闭

# 拦截新窗口请求
@window.on_new_window
def on_new_window(url: str, frame_name: str):
    print(f"拦截新窗口: {url}")
    window.navigate(url)  # 在当前窗口打开
    return True  # 阻止打开新窗口

# 监听文件下载事件 (需 0.3.1+)
@window.on_download_started
def on_download(url: str, filename: str):
    print(f"下载请求: {filename} from {url}")
    if filename.endswith(".exe"):
        return True  # 阻止 exe 文件下载
    return False

# 监听全屏状态改变 (需 1.2+)
@window.on_fullscreen_changed
def on_fullscreen(is_fullscreen: bool):
    print(f"全屏状态: {is_fullscreen}")

window.show()

类型定义

RGBA

颜色结构体。

Python
from jadeui import RGBA

color = RGBA(r=255, g=128, b=64, a=255)

WebViewWindowOptions

窗口配置选项结构体。

WebViewSettings

WebView 行为设置结构体。


异常

JadeUIError

所有 JadeUI 异常的基类。

DLLLoadError

DLL 加载失败。

WindowCreationError

窗口创建失败。

IPCError

IPC 通信错误。

ServerError

本地服务器错误。

InitializationError

SDK 初始化错误。

Python
from jadeui import JadeUIError, WindowCreationError

try:
    window = Window(title="Test")
    window.show()
except WindowCreationError as e:
    print(f"窗口创建失败: {e}")
except JadeUIError as e:
    print(f"JadeUI 错误: {e}")

工具函数

create_app()

快捷创建应用实例。

Python
from jadeui import create_app, Window

app = create_app(
    enable_dev_tools=True,
    log_file="app.log"
)

@app.on_ready
def setup():
    Window(title="My App").show()

app.run()

utils.get_resource_path()

获取资源文件的绝对路径,兼容打包环境。

Python
from jadeui import utils

path = utils.get_resource_path("assets/icon.png")

utils.show_error()

显示错误消息。

Python
from jadeui import utils

utils.show_error("错误", "发生了一个错误")

utils.ensure_directory()

确保目录存在。

Python
from jadeui import utils

utils.ensure_directory("./data/cache")

DLL 下载工具

命令行推荐使用 jadeui download(见 CLI 工具)。以下为 Python API。

download_dll()

下载 JadeView DLL。

Python
from jadeui import download_dll

download_dll(force=False)  # force=True 强制重新下载

ensure_dll()

确保 DLL 存在,不存在则下载。

Python
from jadeui import ensure_dll

ensure_dll()

find_dll()

查找 DLL 文件路径。

Python
from jadeui import find_dll

path = find_dll()

get_architecture()

获取当前系统架构。

Python
from jadeui import get_architecture

arch = get_architecture()  # "x64" 或 "x86"