Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/backends.rst
Original file line number Diff line number Diff line change
Expand Up @@ -440,7 +440,7 @@ Similar as with PyScript, you can chose between a ``<canvas>`` and a ``<div cla
<html>
<head>
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<script src="https://cdn.jsdelivr.net/pyodide/v0.29.0/full/pyodide.js"></script>
<script src="https://cdn.jsdelivr.net/pyodide/v314.0.7/full/pyodide.js"></script>
</head>
<body>
<canvas id="canvas" width="640" height="480"></canvas>
Expand Down
2 changes: 1 addition & 1 deletion docs/static/_pyodide_iframe.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<head>
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Rendercanvas example.py in Pyodide</title>
<script src="https://cdn.jsdelivr.net/pyodide/v0.29.0/full/pyodide.js"></script>
<script src="https://cdn.jsdelivr.net/pyodide/v314.0.7/full/pyodide.js"></script>
</head>

<body>
Expand Down
2 changes: 1 addition & 1 deletion examples/pyodide.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<head>
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>RenderCanvas Pyodide example</title>
<script src="https://cdn.jsdelivr.net/pyodide/v0.29.0/full/pyodide.js"></script>
<script src="https://cdn.jsdelivr.net/pyodide/v314.0.7/full/pyodide.js"></script>
</head>

<body>
Expand Down
4 changes: 2 additions & 2 deletions examples/serve_browser_examples.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ def get_html_index():
<head>
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>RenderCanvas PyScript examples</title>
<script type="module" src="https://pyscript.net/releases/2025.11.1/core.js"></script>
<script type="module" src="https://pyscript.net/releases/2026.7.3/core.js"></script>
</head>
<body>

Expand All @@ -84,7 +84,7 @@ def get_html_index():
<head>
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>example.py via PyScript</title>
<script type="module" src="https://pyscript.net/releases/2025.11.1/core.js"></script>
<script type="module" src="https://pyscript.net/releases/2026.7.3/core.js"></script>
</head>

<body>
Expand Down
8 changes: 7 additions & 1 deletion rendercanvas/pyodide.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
raise ImportError("This module is only for use with Pyodide in the browser.")

from pyodide.ffi import create_proxy, to_js
from pyodide.code import run_js
from js import window, document, ImageData, Uint8ClampedArray, OffscreenCanvas


Expand Down Expand Up @@ -72,6 +73,11 @@ def __init__(
# If size or title are not given, set them to None, so they are left as-is. This is usually preferred in html docs.
kwargs["size"] = kwargs.get("size", None)

# instead of using the callback directly (which blocks stack switching), chain on the resolve. TODO: avoid the eval and implement it using pyodide ffi
self._next_frame_promise = run_js(
"() => new Promise(resolve => requestAnimationFrame(resolve))"
)()

# Finalize init
super().__init__(*args, **kwargs)
self._final_canvas_init()
Expand Down Expand Up @@ -133,7 +139,7 @@ def _rc_request_draw(self):
self._time_to_draw()

def _rc_request_paint(self):
window.requestAnimationFrame(create_proxy(lambda _: self._time_to_paint()))
self._next_frame_promise.then(lambda _: self._time_to_paint())

def _rc_force_paint(self):
# Not very clean to do this, and not sure if it works in a browser;
Expand Down
Loading