Как мне создать индикатор загрузки в боке? - PullRequest
0 голосов
/ 22 апреля 2019

Я использую радио кнопку с боке.Я хочу иметь возможность отображать индикатор загрузки при нажатии переключателя, а затем показывать, что он завершился после завершения обратного вызова python.Как вы делаете это с Bokeh?

Я пытался использовать комбинации js_onchange с onchange для переключателей.Я просто не могу придумать способ уведомить сторону JS о завершении обратного вызова Python.

callback = CustomJS(args={}, code="""
  document.getElementById('message_display').innerHTML = 'loading...';
""")

radio_button.js_on_change('active', callback)
radio_button.on_change('active', some_other_callback)

Когда я запускаю его, innerHTML устанавливается на загрузку, а обратный вызов Python on_change запускается играфик обновляется, но у меня нет никакого способа вызвать изменение на стороне JS. Измените innerHTML, чтобы сказать выполнено.

1 Ответ

0 голосов
/ 23 апреля 2019

Предполагая, что у пользователя уже есть представление графика, одним из вариантов будет установка обратного вызова для атрибута start диапазона графика, чтобы он срабатывал при обновлении графика.

from bokeh.models import CustomJS

p = figure()

def python_callback()
    p.y_range = Range1d(None, None)
    # get your data here and update the plot

code = "document.getElementById('message_display').innerHTML = 'loading finished';"
callback = CustomJS(args = dict(), code = code)
p.y_range.js_on_change('start', callback)

Смотрите рабочий пример ниже:

import numpy as np
from bokeh.plotting import figure, show
from bokeh.models import CustomJS, ColumnDataSource

points = np.random.rand(50, 2)
cds = ColumnDataSource(data = dict(x = points[:, 0], y = points[:, 1]))

p = figure(x_range = (0, 1), y_range = (0, 1))
p.scatter(x = 'x', y = 'y', source = cds)

cb_to_make_selection = CustomJS(args = {'cds': cds}, code = """
function getRandomInt(max){return Math.floor(Math.random() * Math.floor(max));}
cds.selected.indices = [getRandomInt(cds.get_length()-1)]
""")

p.x_range.js_on_change('start', cb_to_make_selection)

show(p)
...