# 使用方法

# 基础

启动并运行 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 参数设置为所需的值(例如 cefqt)。详细信息参见 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()