# 使用方法
# 基础
启动并运行 pywebview 的最低要求是
import webview
window = webview.create_window('Woah dude!', 'https://pywebview.flowrl.com')
webview.start()
create_window
函数创建一个新窗口并返回一个 Window
对象实例。在 webview.start()
之前创建的窗口将在 GUI 循环启动后显示。在 GUI 循环启动后创建的窗口会立即显示。您可以创建任意数量的窗口,所有已打开的窗口作为一个列表存储在 webview.windows
中,按照创建顺序存储。
import webview
first_window = webview.create_window('Woah dude!', 'https://pywebview.flowrl.com')
second_window = webview.create_window('Second window', 'https://woot.fi')
webview.start()
pywebview 提供了使用多种 Web 渲染器的选择。要更改 Web 渲染器,请将 start
函数的 gui
参数设置为所需的值(例如 cef
或 qt
)。详细信息参见 Renderer。
# 后端逻辑
webview.start
启动一个 GUI 循环,并阻止进一步代码执行,直到最后一个窗口被销毁。由于 GUI 循环是阻塞的,您必须在单独的线程或进程中执行后端逻辑。您可以通过将函数传递给 webview.start(func, (params,))
来执行后端代码。这将启动一个单独的线程,等同于手动启动一个线程。
import webview
def custom_logic(window):
window.toggle_fullscreen()
window.evaluate_js('alert("Nice one brother")')
window = webview.create_window('Woah dude!', html='<h1>Woah dude!<h1>')
webview.start(custom_logic, window)
# 此行以下的代码将在程序执行完毕后运行
pass
# Javascript 和 Python 之间的通信
您可以从 Python 运行 Javascript 代码,反之亦然。要从 Python 运行 Javascript,请使用 window.evaluate_js(code)
。此函数返回 Javascript 代码最后一行的结果。如果代码返回一个 promise,您可以通过传递回调函数 window.evaluate_js(code, callback)
来解析它。如果 Javascript 抛出错误,window.evaluate_js
会引发 webview.errors.JavascriptException
。
要从 Javascript 运行 Python,您需要通过 webview.create_window(url, js_api=api_instance)
暴露您的 API 类。类的成员函数将在 Javascript 域中以 window.pywebview.api.funcName
的形式可用。您也可以在运行时使用 window.expose(func)
暴露单个函数。详见 跨域通信。
import webview
class Api():
def log(self, value):
print(value)
webview.create_window("Test", html="<button onclick='pywebview.api.log("Woah dude!")'>Click me</button>", js_api=Api())
webview.start()
或者,您可以使用更传统的方法,通过 REST API 配合 WSGI 服务器进行跨域通信。示例参见 Flask app (opens new window)。
# HTTP 服务器
pywebview 内部使用 bottle.py (opens new window) HTTP 服务器来提供静态文件服务。相对的本地路径通过内置 HTTP 服务器提供服务。入口点目录作为 HTTP 服务器的根目录,目录及其子目录下的所有内容都被共享。您可以通过设置 webview.start(ssl=True)
启用服务器的 SSL。
import webview
webview.create_window('Woah dude!', 'src/index.html')
webview.start(ssl=True)
如果您希望使用外部 WSGI 兼容的 HTTP 服务器,可以将服务器应用程序对象作为 URL 传递。
from flask import Flask
import webview
server = Flask(__name__, static_folder='./assets', template_folder='./templates')
webview.create_window('Flask example', server)
webview.start()
如果您的目的是在没有 HTTP 服务器的情况下通过 file://
协议提供文件服务,可以使用绝对文件路径或通过 file://
协议前缀路径实现。
import webview
# 将作为 file:///home/pywebview/project/index.html 提供服务
webview.create_window('Woah dude!', '/home/pywebview/project/index.html')
webview.start()
# 加载 HTML
或者,您可以通过设置 html
参数或使用 window.load_html
函数加载 HTML。这种方法的限制是文件系统在加载页面的上下文中不存在。图片和其他资源只能通过 Base64 内联加载。
import webview
webview.create_window('Woah dude!', html='<h1>Woah dude!<h1>')
webview.start()