Javascript–Python桥梁
Javascript–Python桥梁
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.api
在window.onload
事件发生时并不保证一定可用。为了确保window.pywebview.api
已经准备好,您可以订阅window.pywebviewready
事件来获取通知。
查看示例。