PyPixoo
The Pixoo library you can trust — BDD-first, well-tested.
A Python library for the Divoom Pixoo 64 display. This is a true behavior-driven design project: behaviors come first.
What is this?
PyPixoo is a reimplementation of Pixoo control logic, inspired by pixoo but built with BDD from the ground up.
V2 is a breaking redesign that aligns with native Pixoo command behavior:
- Native sequence upload via
Draw/SendHttpGifandDraw/CommandList - Native GIF playback via
Device/PlayTFGif - Native text overlays via
Draw/SendHttpText/Draw/ClearHttpText - Native cycle orchestration across uploaded sequences and GIF sources
Requirements
- Python 3.9+
- A Divoom Pixoo 64 on your network (for real-device use; specs use a mock)
Installation
cd PyPixoo
pip install -e ".[dev]"
Run specs
behave
Specs mock the device HTTP layer, so no Pixoo is required.
CLI
A pypixoo command is installed with the package. Set PIXOO_REAL_DEVICE=1 to send to a real device.
# Fill the display with a color (hex or name)
PIXOO_REAL_DEVICE=1 pypixoo fill FF00FF
# Load an image (resized to 64×64) and push
PIXOO_REAL_DEVICE=1 pypixoo load-image path/to/image.png
# Upload native sequence
PIXOO_REAL_DEVICE=1 pypixoo upload-sequence frame1.png frame2.png --speed-ms 120 --mode command_list --chunk-size 40
# Native GIF playback
PIXOO_REAL_DEVICE=1 pypixoo play-gif-url https://example.com/anim.gif
PIXOO_REAL_DEVICE=1 pypixoo play-gif-file divoom_gif/1.gif
PIXOO_REAL_DEVICE=1 pypixoo play-gif-dir divoom_gif/
# Cycle ordered items
PIXOO_REAL_DEVICE=1 pypixoo cycle --item 'sequence=120:frame1.png,frame2.png' --item 'url=https://example.com/anim.gif' --loop 2
If the pypixoo script is not on your PATH, run python -m pypixoo.cli instead.
Usage
Basic display
from pypixoo import Pixoo
pixoo = Pixoo("192.168.0.37")
pixoo.connect()
pixoo.fill(255, 0, 68)
pixoo.push()
Native HttpGif upload
from pypixoo import GifFrame, GifSequence, Pixoo, UploadMode
from pypixoo.buffer import Buffer
pixoo = Pixoo("192.168.0.37")
pixoo.connect()
buf = Buffer.from_flat_list([c for _ in range(64 * 64) for c in (255, 0, 0)])
seq = GifSequence(frames=[GifFrame(image=buf, duration_ms=120)], speed_ms=120)
pic_id = pixoo.upload_sequence(seq, mode=UploadMode.COMMAND_LIST, chunk_size=40)
print(pic_id)
Native GIF playback and overlays
from pypixoo import GifSource, Pixoo, TextOverlay
pixoo = Pixoo("192.168.0.37")
pixoo.connect()
pixoo.play_gif(GifSource.url("https://example.com/anim.gif"))
# Overlay text is intended for uploaded HttpGif playback contexts
pixoo.send_text_overlay(TextOverlay(text="hello", x=0, y=40, text_id=1))
pixoo.clear_text_overlay()
Mix static and generated frames, then upload natively
from pypixoo import FrameRenderer, Pixoo, StaticFrameSource, UploadMode, WebFrameSource
from pypixoo.buffer import Buffer
buf = Buffer.from_flat_list([80] * (64 * 64 * 3))
renderer = FrameRenderer(
sources=[
StaticFrameSource(buffer=buf, duration_ms=100),
WebFrameSource(url="http://localhost:6006/?t=0.1", timestamps=[0.0, 0.5, 1.0], duration_per_frame_ms=150),
]
)
seq = renderer.precompute()
pixoo = Pixoo("192.168.0.37")
pixoo.connect()
pixoo.upload_sequence(seq, mode=UploadMode.COMMAND_LIST)
Cycle orchestration
from pypixoo import CycleItem, GifSource, Pixoo
pixoo = Pixoo("192.168.0.37")
pixoo.connect()
items = [
CycleItem(source=GifSource.url("https://example.com/a.gif")),
CycleItem(source=GifSource.tf_file("divoom_gif/1.gif")),
]
handle = pixoo.start_cycle(items, loop=2)
handle.wait()
Project structure
PyPixoo/
storybook-app/ # React components for 64×64 (Storybook)
features/ # Gherkin specs (behave)
src/pypixoo/ # Library
tests/ # Unit tests (pytest)
PR_FAQ.md # Project rationale and roadmap
AGENTS.md # Agent guide
Metadata
Release files for pypixoo 2.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pypixoo-2.3.0.tar.gz | 20.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pypixoo-2.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 37.7 kB
Release files / pypixoo-2.3.0.tar.gz
| Download URL | pypixoo-2.3.0.tar.gz |
|---|---|
| Size | 20.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
18f312688d5016d382bbff4ddc7f72d856a925c640122cc169edc34c6bed7b37
|
|
BLAKE2b-256 checksum How to use checksums |
5fd29af7b979ead8d7221e5b1fde46f000789a8f62deaca6ea8ee6723355247c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Mar 2, 2026.
Transparency logRelease files / pypixoo-2.3.0-py3-none-any.whl
| Download URL | pypixoo-2.3.0-py3-none-any.whl |
|---|---|
| Size | 16.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5700da08bd4de5c1dbaab52b5e6a95a94b3b2720cdd811aaf46df03e411b2537
|
|
BLAKE2b-256 checksum How to use checksums |
8c1d92284af940776562eb12ffe7bdb5a065d2e934c8746ff2b2334102876a57
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Mar 2, 2026.
Transparency log