-
Notifications
You must be signed in to change notification settings - Fork 132
/
base.py
42 lines (34 loc) · 1.08 KB
/
base.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
from ipywidgets import DOMWidget
from traitlets import Bool, List, observe
def _singleton(cls):
# https://www.python.org/dev/peps/pep-0318/#examples
instances = {}
def getinstance():
if cls not in instances:
instances[cls] = cls()
return instances[cls]
return getinstance
class BaseWidget(DOMWidget):
_msg_q = []
_msg_ar = List().tag(sync=True)
_ready = Bool(False).tag(sync=True)
def _js(self, code):
self._call("executeCode", code)
def _call(self, method_name, *args, **kwargs):
msg = {"type": "callMethod",
"methodName": method_name,
"args": args, "kwargs": kwargs}
if not self._ready:
# fire later
self._msg_q.append(msg)
else:
self.send(msg)
msg_ar = self._msg_ar[:]
msg_ar.append(msg)
self._msg_ar = msg_ar # trigger sync
@observe("_ready")
def _on_ready(self, change):
if change.new:
while self._msg_q:
msg = self._msg_q.pop(0)
self.send(msg)