Skip to content

Add canvas support to pyide#1123

Open
Copilot wants to merge 14 commits into
mainfrom
copilot/add-canvas-support-to-pyide
Open

Add canvas support to pyide#1123
Copilot wants to merge 14 commits into
mainfrom
copilot/add-canvas-support-to-pyide

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented May 8, 2026

Pyide had no way to render graphics output, blocking use of pygame and other SDL-based libraries available in Pyodide. This adds a canvas attribute to the :::pyide directive that wires up an OffscreenCanvas to pyodide.canvas.setCanvas2D() in the web worker.

Changes

  • remarkDirectivePyide.ts — Detects canvas attribute; sets data-canvas="true", injects a <canvas> element and a Canvas tab button into the output area
  • client.js — On init, transfers the canvas to an OffscreenCanvas and posts it to the worker; adds showCanvas() tab logic; auto-switches to Canvas tab on run when in canvas mode
  • webworker.js — Handles setCanvas message, stores OffscreenCanvas per pyide ID, calls pyodide.canvas.setCanvas2D(canvas) before each run
  • style.css — Styles the canvas element with min-height: 300px
  • en.json / de.json — Adds pyide-canvas translation key

Usage

:::pyide{canvas}

```python
import pygame
pygame.init()
screen = pygame.display.set_mode((400, 300))
screen.fill((0, 128, 255))
pygame.display.flip()

:::


The canvas transfers control to an `OffscreenCanvas` once at init time (irreversible per the browser API); errors during transfer or `setCanvas2D` are caught and surfaced without crashing the worker.

@vercel
Copy link
Copy Markdown

vercel Bot commented May 8, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
hyperbook-4fwa Ready Ready Preview, Comment May 11, 2026 7:28pm

Copilot AI linked an issue May 8, 2026 that may be closed by this pull request
Copilot AI changed the title [WIP] Add canvas support to pyide Add canvas support to pyide May 8, 2026
Copilot AI requested a review from mikebarkmin May 8, 2026 21:57
@mikebarkmin
Copy link
Copy Markdown
Member

@copilot add an example to the website for element pyide.

@mikebarkmin mikebarkmin marked this pull request as ready for review May 9, 2026 15:22
mikebarkmin and others added 4 commits May 10, 2026 00:18
- Add unProxy() helper to convert Pyodide PyProxy objects to JavaScript objects
- Update js_graphic_size() to unproxy specs parameter
- Update js_render_graphic() to unproxy specs parameter
- Fixes issue where Pytamaro graphic specs weren't being processed correctly

This implementation is based on the reference implementation pattern used in
other Pytamaro-Pyodide integrations, which properly handles PyProxy objects
returned from Python code.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add error logging to unProxy() helper for debugging
- Wrap FFI functions in try-catch blocks with console.error logging
- Fix incomplete catch block in js_render_graphic
- Improves debugging when Pytamaro rendering fails

This helps identify issues when PyProxy object conversion or graphic
rendering fails, making it easier to diagnose Pytamaro integration problems.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Parse @@@PYTAMARO_DATA_URI_BEGIN/END@@@ markers in stdout and render
  as <img> elements instead of plain text
- Fix dict_converter: Object.fromEntries in unProxy() so Python dicts
  are converted to plain JS objects (not Maps), allowing buildGraphic()
  to access spec.t, spec.width, spec.color etc. correctly
- Remove incorrect {canvas} attribute from pytamaro pyide examples
  (pytamaro renders via stdout/output tab, not the pygame canvas tab)
- Fix heading typo Pytamato -> Pytamaro in English docs
- Add missing Pytamaro section to German docs

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
mikebarkmin and others added 3 commits May 11, 2026 17:02
- add stateful stdout carry buffer to reconstruct split
  @@@PYTAMARO_DATA_URI_BEGIN/END@@@ markers across callbacks
- render pytamaro data URIs as images even when markers arrive in chunks
- clear marker carry buffer at run/test boundaries to avoid stale state
- disable stop button when idle to avoid confusing stop(refresh) state

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Switch pyodide stdout/stderr handlers from batched line mode to write mode. This captures pytamaro data URI output even when show_graphic() prints with end='' and no trailing newline, matching the reference behavior. Also adjust output appenders to handle raw chunks without forcing extra newlines.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
When pytamaro is detected (via packages or imports), prefer the output pane and skip pygame canvas setup even if {canvas} is present. This prevents invisible runs caused by canvas-first UI when pytamaro renders through stdout image markers.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add canvas support to pyide

2 participants