文档
文档
idepy 27 1291字 约3分钟

Javascript–Python双向通讯

IDEPY Next继承了pywebview 提供的Javascript和Python之间的双向通信,允许在不使用HTTP服务器的情况下实现这两种语言的交互。

从Python运行Javascript代码

通过window.evaluate_js(code, callback=None)方法,您可以执行任意的Javascript代码,并且能够同步地获取最后一个返回值。如果提供了回调函数,则会处理承诺并将结果作为参数传递给该回调函数。在转换过程中,所有的Javascript类型都会被转化为Python类型,例如JS对象转为字典,数组转为列表,undefined转为None。如果执行的Javascript代码产生了错误,这个错误会被重新抛出为一个webview.util.JavascriptException异常,在Python中可以捕获到这个异常。evaluate_js方法内部会将Javascript代码包裹在一个辅助函数中,然后使用eval进行执行。

查看示例

通过window.run_js(code)方法,您可以不带任何包装代码地执行原封不动的Javascript代码。与evaluate_js不同的是,run_js不会返回结果,并且不处理异常情况。这在某些情况下非常有用,尤其是当您需要按照unsafe-eval内容安全策略来执行Javascript代码时。

从Javascript运行Python代码

从Javascript调用Python函数可以使用两种不同的机制实现:

  • 第一种方式:通过将一个Python类的实例传递给create_window方法的js_api参数,这样该类的所有可调用方法都会被自动暴露到Javascript环境,形式为pywebview.api.method_name。需要注意的是,方法名称不能以下划线开头,并且允许嵌套的类结构,这种情况下嵌套的类在Javascript端会转化为嵌套的对象结构。另外,类属性如果是以下划线开头,则不会被暴露出去。查看示例

  • 第二种方式:通过将函数传递给window对象的expose(func)方法,这样函数会被暴露到Javascript域中,形式为pywebview.api.func_name。与JS API不同的是,expose方法允许在运行时动态地暴露函数,并且如果在命名上出现了冲突(即JS API中的方法名和已暴露的函数名相同),那么后者会优先被使用。查看示例

被暴露出来的函数返回一个承诺对象(promise),这个承诺会被解析为该函数的结果值。遇到异常情况则会以Error对象包裹,并抛出一个拒绝的承诺。可以通过error.stack获取到错误栈信息。需要注意的是,这些被暴露的函数是在单独的线程中执行的,因此它们并不是线程安全的。

window.pywebview.apiwindow.onload事件发生时并不保证一定可用。为了确保window.pywebview.api已经准备好,您可以订阅window.pywebviewready事件来获取通知。

查看示例

目录
注册
{{page_data?.register_msg}}
申请账号
发送重置邮件
搜索
{{downloadForm?.title}}
描述:{{downloadForm?.description || '暂无描述信息'}}
备注:
打开下载地址
如未自动打开请手动点击
({{userInfoData?.nickname || '昵称'}}){{userInfoData?.username || '用户名'}}
ID:{{userInfoData?.id || 0}}
{{userInfoData?.money || '0'}}余额 {{userInfoData?.coin || '0'}}积分
VIP
{{item?.label}}
保存信息
修改密码
粉丝权益暂未激活
粉丝权益已激活
{{item?.name}}
qrcode