Python bindings for the pgwidgets JavaScript widget library
Project description
pgwidgets — Python Bindings
Python bindings for the pgwidgets JavaScript widget library. Build desktop-style browser UIs from Python with a familiar Qt/GTK-style API.
Documentation
Full documentation is available at pgwidgets-python.readthedocs.io.
Installation
pip install pgwidgets-python
This will also install pgwidgets-js (the JavaScript assets) and
websockets as dependencies.
Quick Start
from pgwidgets.sync import Application
app = Application()
@app.on_connect
def setup(session):
Widgets = session.get_widgets()
top = Widgets.TopLevel(title="Hello", resizable=True)
top.resize(400, 300)
vbox = Widgets.VBox(spacing=8, padding=10)
btn = Widgets.Button("Click me")
label = Widgets.Label("Ready")
btn.on("activated", lambda: label.set_text("Clicked!"))
vbox.add_widget(btn, 0)
vbox.add_widget(label, 1)
top.set_widget(vbox)
top.show()
app.run()
Run the script, then open the printed URL in your browser.
Sync vs Async
Both APIs provide the same widget classes and methods.
Synchronous (recommended for most use cases):
from pgwidgets.sync import Application
app = Application()
@app.on_connect
def setup(session):
Widgets = session.get_widgets()
btn = Widgets.Button("Click") # blocking call
btn.set_text("New text") # blocking call
app.run()
Asynchronous (for asyncio applications):
from pgwidgets.async_ import Application
app = Application()
@app.on_connect
async def setup(session):
Widgets = session.get_widgets()
btn = await Widgets.Button("Click") # awaitable
await btn.set_text("New text") # awaitable
await app.run()
How It Works
The Application class starts two servers:
- An HTTP server (default port 9501) that serves the pgwidgets JS/CSS and a connector page
- A WebSocket server (default port 9500) for the JSON command protocol
When you open the URL in a browser, the page loads pgwidgets and connects back over WebSocket. Python widget constructors and method calls are translated to JSON messages and executed in the browser. Callbacks are forwarded back to Python.
Sessions and Reconnection
Sessions persist independently of browser connections. When a browser disconnects (page refresh, network drop, tab close), the session and its widget tree remain alive on the Python side. When the browser reconnects, the entire UI is automatically reconstructed.
app = Application(max_sessions=4, logger=logger)
@app.on_connect
def setup(session):
Widgets = session.get_widgets()
# Build your UI...
# If the browser refreshes, this UI is reconstructed automatically.
Key features:
- Automatic reconstruction -- refresh the browser and the UI reappears in its current state (widget positions, text, slider values, etc.).
- Multi-browser support -- open the same session URL in a second browser tab or window. Both browsers show the same UI and stay synchronized. Widget state changes (slider moves, tab switches, tree expand/collapse) are pushed to all connected browsers in real time.
- Headless sessions -- create sessions without a browser using
app.create_session(), build the widget tree, then connect a browser later to see the pre-built UI.
License
BSD 3-Clause
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pgwidgets_python-0.3.2.tar.gz.
File metadata
- Download URL: pgwidgets_python-0.3.2.tar.gz
- Upload date:
- Size: 165.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6d9f683c06f858b5d7b94b11f16b8a893a8bdd364fb9dd815f16b90cf90fff1b
|
|
| MD5 |
75bb823be781708f1b558e89c9324165
|
|
| BLAKE2b-256 |
7601dd534e55c6ea82784d2216d45d18ee6c4e7116f2d3009c524763cc38a1a0
|
File details
Details for the file pgwidgets_python-0.3.2-py3-none-any.whl.
File metadata
- Download URL: pgwidgets_python-0.3.2-py3-none-any.whl
- Upload date:
- Size: 88.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3b6845f16d9b9084623fa3651035a103ddfa31b949d3dfe1975e9697992fead5
|
|
| MD5 |
3f030f89c71e5d96aeebdbbfa6595618
|
|
| BLAKE2b-256 |
f81ce4966e777f9857451f291d52a6f436b8515ff49d65671083507a2395faa8
|