Easily create HTML webviewers in python utilizing the wry library. Unlike many HTML viewers that exist for Python - Pywry allows you to run javascript. PyWry is also a ~2mb footprint for Mac and Windows - Linux will require a few more libraries which are listed below.
Please note: this library is currently in early alpha and is NOT ready for production use.
PyWry is available on PyPI and can be installed with pip:
pip install pywry
For development, you can install from source with the following steps:
git clone https://github.com/OpenBB-finance/pywry.git
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
python -m venv venv
source venv/bin/activate
(Unix) or venv\Scripts\activate
(Windows)pip install .[dev]
maturin build
pip install [file path from above] --force-reinstall
import asyncio
import sys
from pywry import PyWry
async def main_loop():
while True:
await asyncio.sleep(1)
if __name__ == "__main__":
try:
handler = PyWry()
handler.send_html("<h1 style='color: red;'>Welcome to PyWry!</h1>")
handler.start()
# PyWry creates a new thread for the backend,
# so we need to run the main loop in the main thread.
# otherwise, the program will exit immediately.
handler.loop.run_until_complete(main_loop())
except KeyboardInterrupt:
print("Keyboard interrupt detected. Exiting...")
sys.exit(0)
PyWry uses a JSON object to communicate between the python and rust backends and the javascript frontend. The following keys are available:
Key | Type | Description |
---|---|---|
html |
Path \| str |
The path to the HTML file to be loaded, or HTML string. |
title |
str |
The title of the window. |
icon |
str \| Path |
The path to png icon to be used for the window. |
json_data |
str \| dict |
A JSON string or dictionary to be passed to the javascript frontend. (see below) |
height |
int |
The height of the window. |
width |
int |
The width of the window. |
download_path |
str \| Path |
The path to the download directory. |
PyWry allows you to run javascript in the frontend. To do this, you can pass a dictionary
of data to the json_data
key in the send_html
method. This dictionary will be converted
to a JSON string and passed to the frontend. You can then access this data in the frontend
by using the window.json_data
object. For example:
from pathlib import Path
# code from above ...
# change send_html line to:
handler.send_html(
html=Path(__file__).parent / "index.html", json_data={"name": "PyWry"}
)
<html>
<head>
<script>
window.onload = () => {
// if you passed a JSON string, you will need to parse it first
if (typeof window.json_data === "string") {
window.json_data = JSON.parse(window.json_data);
}
document.getElementById("name").innerHTML = window.json_data.name;
};
</script>
</head>
<body>
<h1 style='color: red;'>Hello, <span id="name"></span>!</h1>
</body>
</html>
All platforms use TAO to build the window, and wry re-exports it as an application module. Here is the underlying web engine each platform uses, and some dependencies you might need to install.
Tao uses gtk-rs and its related libraries for window creation and wry also needs WebKitGTK for WebView. So please make sure the following packages are installed:
sudo pacman -S webkit2gtk
sudo apt install libwebkit2gtk-4.0-dev
sudo dnf install gtk3-devel webkit2gtk3-devel
WebKit is native to macOS, so no additional dependencies are needed.
WebView2 provided by Microsoft Edge Chromium is used. So wry supports Windows 7, 8, 10 and 11.
"/lib/x86_64-linux-gnu/libgio-2.0.so.0: undefined symbol: g_module_open_full"
This is a known issue with the gio
library. You can fix it by installing the libglib2.0-dev
package.
PyWry is a project that aims to provide Python bindings for WRY, a cross-platform webview library. WRY is a trademark of the Tauri Program within the Commons Conservancy and PyWry is not officially endorsed or supported by them. PyWry is an independent and community-driven effort that respects the original goals and values of Tauri and WRY. PyWry does not claim any ownership or affiliation with WRY or the Tauri Program.