Skip to content

Portability & platforms

Portability is PyDisplay's defining feature. Write your display, input, and timing code once against board_config, and it runs unchanged across every supported runtime and target below. This page is the single home for the platform matrix; each row links to platform-specific notes.

Where PyDisplay runs

Runtime Microcontrollers Unix / Linux Windows Browser Jupyter Notebook
MicroPython PyScript · Wokwi
CircuitPython
CPython Jupyter

How portability works

The same import works on every platform:

from board_config import display_drv, broker

What changes is which display backend board_config selects — automatically on desktop, PyScript, and Jupyter, or explicitly via a per-board config on hardware:

Backend Used on Selected by
BusDisplay MicroPython / CircuitPython MCUs (SPI / I80) board config
FBDisplay CircuitPython framebuffer displays (RGB, USB video) board config
SDLDisplay CPython, MicroPython Unix, CircuitPython Unix (SDL2) auto / board_configs/sdldisplay/
PGDisplay CPython desktop (PyGame — easy on Windows) auto / board_configs/pgdisplay/
PSDisplay PyScript browser canvas auto
JNDisplay Jupyter Notebook auto

Input is just as portable: a mouse on the desktop, a finger on a touchscreen, and a tap in the browser all arrive as the same events. Timers come from multimer, which picks a backend (machine.Timer, librt, threads, polling, SDL, or asyncio) to suit the host.

See Displays for backend details and Architecture for how the pieces fit together.

Platform notes

Build GUIs across platforms

Because the backend is portable, anything built on PyDisplay inherits that portability — including the LVGL sister projects for MicroPython, CircuitPython, and CPython. You can even prototype an LVGL app in Jupyter and run it unchanged on a microcontroller.