Source code for bokeh.models.callbacks
""" Client-side interactivity. """
from __future__ import absolute_import
from types import FunctionType
from ..model import Model
from ..util.dependencies import import_required
from ..util.compiler import nodejs_compile, CompilationError
from ..core.properties import abstract
from ..core.properties import Dict, Instance, String
@abstract
[docs]class Callback(Model):
""" Base class for interactive callback. ``Callback`` is generally
not useful to instantiate on its own."""
[docs]class OpenURL(Callback):
""" Open a URL in a new tab or window (browser dependent). """
url = String("http://", help="""
The URL to direct the web browser to. This can be a template string,
which will be formatted with data from the data source.
""")
[docs]class CustomJS(Callback):
""" Execute a JavaScript function. """
@classmethod
[docs] def from_py_func(cls, func):
""" Create a CustomJS instance from a Python function. The
function is translated to Python using PyScript.
"""
if not isinstance(func, FunctionType):
raise ValueError('CustomJS.from_py_func needs function object.')
pyscript = import_required('flexx.pyscript',
'To use Python functions for CustomJS, you need Flexx ' +
'("conda install -c bokeh flexx" or "pip install flexx")')
# Collect default values
default_values = func.__defaults__ # Python 2.6+
default_names = func.__code__.co_varnames[:len(default_values)]
args = dict(zip(default_names, default_values))
args.pop('window', None) # Clear window, so we use the global window object
# Get JS code, we could rip out the function def, or just
# call the function. We do the latter.
code = pyscript.py2js(func, 'cb') + 'cb(%s);\n' % ', '.join(default_names)
return cls(code=code, args=args)
@classmethod
[docs] def from_coffeescript(cls, code, args={}):
""" Create a ``CustomJS`` instance from CoffeeScript code. """
compiled = nodejs_compile(code, lang="coffeescript", file="???")
if "error" in compiled:
raise CompilationError(compiled.error)
else:
return cls(code=compiled.code, args=args)
args = Dict(String, Instance(Model), help="""
A mapping of names to Bokeh plot objects. These objects are made
available to the callback code snippet as the values of named
parameters to the callback.
""")
code = String(default="", help="""
A snippet of JavaScript code to execute in the browser. The
code is made into the body of a function, and all of of the named objects in
``args`` are available as parameters that the code can use. Additionally,
a ``cb_obj`` parameter contains the object that triggered the callback
and an optional ``cb_data`` parameter that contains any tool-specific data
(i.e. mouse coordinates and hovered glyph indices for the HoverTool).
.. note:: Use ``CustomJS.from_coffeescript()`` for CoffeeScript source code.
""")