Skip to content

Commit 302126a

Browse files
authored
Merge pull request #558 from bnmajor/jupyterlite
Jupyterlite
2 parents e6452dc + 0fe31fb commit 302126a

File tree

4 files changed

+136
-58
lines changed

4 files changed

+136
-58
lines changed

docs/jupyterlite/files/Hello3DWorld.ipynb

Lines changed: 80 additions & 46 deletions
Large diffs are not rendered by default.
Binary file not shown.
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
from enum import Enum
2+
3+
4+
class Env(Enum):
5+
JUPYTER_NOTEBOOK = 'notebook'
6+
JUPYTERLAB = 'lab'
7+
JUPYTERLITE = 'lite'
8+
SAGEMAKER = 'sagemaker'
9+
HYPHA = 'hypha'
10+
COLAB = 'colab'
11+
12+
13+
def find_env():
14+
try:
15+
from google.colab import files
16+
return Env.COLAB
17+
except:
18+
try:
19+
from IPython import get_ipython
20+
parent_header = get_ipython().parent_header
21+
username = parent_header['header']['username']
22+
if username == '':
23+
return Env.JUPYTERLAB
24+
elif username == 'username':
25+
return Env.JUPYTER_NOTEBOOK
26+
else:
27+
return Env.SAGEMAKER
28+
except AttributeError:
29+
try:
30+
import js
31+
return Env.JUPYTERLITE
32+
except ImportError:
33+
return Env.HYPHA
34+
35+
36+
ENVIRONMENT = find_env()

itkwidgets/viewer.py

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from ._initialization_params import init_params_dict, init_key_aliases
1212
from ._method_types import deferred_methods
1313
from .integrations import _detect_render_type, _get_viewer_image, _get_viewer_point_sets
14+
from .integrations.environment import ENVIRONMENT, Env
1415
from .render_types import RenderType
1516
from .viewer_config import ITK_VIEWER_SRC, PYDATA_SPHINX_HREF, MUI_HREF
1617

@@ -35,8 +36,9 @@ def __init__(
3536
self.init_data = {}
3637
self.img = display(HTML(f'<div />'), display_id=str(uuid.uuid4()))
3738
self.wid = None
38-
self.viewer_event = threading.Event()
39-
self.data_event = threading.Event()
39+
if ENVIRONMENT is not Env.JUPYTERLITE:
40+
self.viewer_event = threading.Event()
41+
self.data_event = threading.Event()
4042

4143
def _get_input_data(self):
4244
input_options = ["data", "image", "label_image", "point_sets"]
@@ -98,11 +100,12 @@ async def run(self, ctx):
98100
config=config,
99101
)
100102
_viewer_count += 1
101-
itk_viewer.registerEventListener(
102-
'renderedImageAssigned', self.set_event
103-
)
104-
# Once the viewer has been created any queued requests can be run
105-
asyncio.get_running_loop().call_soon_threadsafe(self.viewer_event.set)
103+
if ENVIRONMENT is not Env.JUPYTERLITE:
104+
itk_viewer.registerEventListener(
105+
'renderedImageAssigned', self.set_event
106+
)
107+
# Once the viewer has been created any queued requests can be run
108+
asyncio.get_running_loop().call_soon_threadsafe(self.viewer_event.set)
106109

107110
self.set_default_ui_values(itk_viewer)
108111
self.itk_viewer = itk_viewer
@@ -155,19 +158,24 @@ def __init__(
155158
self, ui_collapsed=True, rotate=False, ui="pydata-sphinx", **add_data_kwargs
156159
):
157160
"""Create a viewer."""
158-
self.bg_jobs = bg.BackgroundJobManager()
159161
self.viewer_rpc = ViewerRPC(
160162
ui_collapsed=ui_collapsed, rotate=rotate, ui=ui, **add_data_kwargs
161163
)
162-
self.queue = queue.Queue()
163-
self.deferred_queue = queue.Queue()
164-
self.bg_thread = self.bg_jobs.new(self.queue_worker)
164+
if ENVIRONMENT is not Env.JUPYTERLITE:
165+
self.bg_jobs = bg.BackgroundJobManager()
166+
self.queue = queue.Queue()
167+
self.deferred_queue = queue.Queue()
168+
self.bg_thread = self.bg_jobs.new(self.queue_worker)
165169
api.export(self.viewer_rpc)
166170

167171
@property
168172
def loop(self):
169173
return asyncio.get_running_loop()
170174

175+
@property
176+
def has_viewer(self):
177+
return hasattr(self.viewer_rpc, 'itk_viewer')
178+
171179
async def run_queued_requests(self):
172180
def _run_queued_requests(queue):
173181
method_name, args, kwargs = queue.get()
@@ -190,7 +198,7 @@ def queue_worker(self):
190198
loop.run_until_complete(task)
191199

192200
def queue_request(self, method, *args, **kwargs):
193-
if hasattr(self.viewer_rpc, 'itk_viewer'):
201+
if ENVIRONMENT is Env.JUPYTERLITE or self.has_viewer:
194202
fn = getattr(self.viewer_rpc.itk_viewer, method)
195203
fn(*args, **kwargs)
196204
elif method in deferred_methods():

0 commit comments

Comments
 (0)