The default behavior of jupyter_rfb
is to automatically call get_frame()
when a new draw is requested and when the widget is ready for it. In use-cases where you want to push frames to the widget, you may prefer a different approach. Here is an example solution.
import numpy as np
from jupyter_rfb import RemoteFrameBuffer
class FramePusher(RemoteFrameBuffer):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self._queue = []
def push_frame(self, frame):
self._queue.append(frame)
self._queue[:-10] = [] # drop older frames if len > 10
self.request_draw()
def get_frame(self):
if not self._queue:
return
self.request_draw()
return self._queue.pop(0)
w = FramePusher(css_width="100px", css_height="100px")
w
w.push_frame(np.random.uniform(0, 255, (100, 100)).astype(np.uint8))
# Push 20 frames. Note that only the latest 10 will be shown
for _ in range(20):
w.push_frame(np.random.uniform(0, 255, (100, 100)).astype(np.uint8))
len(w._queue)