#javascript #python #bokeh
#javascript #python #bokeh
Вопрос:
Я использую переключатель с помощью Bokeh. Я хочу иметь возможность отображать индикатор загрузки при нажатии переключателя, а затем показывать, что он завершен после завершения обратного вызова 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 настраивается на загрузку, выполняется обратный вызов on_change Python и обновляется график, но у меня нет способа инициировать изменение на стороне JS, измените innerHTML, чтобы сказать «готово».
Комментарии:
1. Читая ваш пост, я мог бы задать 5 вопросов вместо одного 🙂 1) как создать «индикатор загрузки? 2) Как узнать, когда обратный вызов завершился выполнением? 3 Как выполнить JS-код вне обратного вызова 4) Как вызвать обратный вызов JS из обратного вызова Python? 5) Как вызвать другой обратный вызов JS из текущего обратного вызова JS? Какие ответы вам нужны?
2. Вот обзор. У меня есть переключатель. Я нажимаю переключатель. Это запускает обратный вызов python для запуска с использованием on_change. Я пытаюсь отобразить индикатор загрузки до и индикатор завершения после. Я смог отобразить индикатор загрузки с помощью js_on_change. У меня возникают проблемы с пониманием того, когда код Python завершен, и обновлением интерфейса с помощью JavaScript.
Ответ №1:
Предполагая, что у пользователя уже есть график в поле зрения, одним из вариантов было бы установить обратный вызов для 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)
Комментарии:
1. У меня есть переключатель, который при нажатии изменяет данные корзины. Пользователь не взаимодействует с диаграммой напрямую, кроме нажатия переключателя. Есть ли способ запустить обратный вызов JavaScript при изменении самого графика или базовых данных?
2. Я понимаю, что вы говорите, и это поможет моей ситуации. Что мне нужно сейчас, так это найти событие, которое происходит при изменении моего графика.
3. Это срабатывало только тогда, когда я действительно нажимал и перетаскивал свой диапазон x, а не во время загрузки графика.
4. ДА. Вопрос в этом посте заключался в том, чтобы показывать индикатор загрузки при нажатии переключателя