Я новичок в bokeh и пишу небольшое серверное приложение bokeh, в котором есть сюжет и кнопка. Когда кнопка нажата, данные пересчитываются и график обновляется. Идея состоит в том, что, как только кнопка нажата, она меняет цвет и метку, также появляется текст «вычисление ...». Когда вычисления завершены, график обновляется, и текст исчезает.
Однако, когда кнопка нажата, она не меняет цвет, и текст не отображается до того, как вычисления будут выполнены (это занимает несколько секунд). Все это обновление виджета происходит после расчетов. Вопрос, возможно ли принудительно обновить виджет, например flush = True в случае print () или что-то подобное может быть?
Я не смог найти ничего в документации боке. Я также попытался разделить изменения виджетов и вычисления и выполнить их в двух отдельных функциях, но это не помогло. Установка задержки между сменой кнопки и вызовом функции расчета также не помогла. Кажется, что обновление на виджетах происходит только при выходе из функции обратного вызова или даже позже. Единственное, что я не проверял, это Custom JS, но я не знаю, как написать js код для обновления кнопки.
Спасибо за любую помощь!
Вот пример кода, близкий к тому, что я на самом деле использую:
from bokeh.plotting import figure
from bokeh.models import Button, PreText, ColumnDataSource
from bokeh.layouts import row
p = figure()
source = ColumnDataSource(data={"x":[0], "y":[0]})
p.line(x="x", y="y", source=source)
variable = False
# initialise widgets
switchButton = Button(label='Anticrossing OFF', button_type="default")
process_markup = PreText(text='Calculating...', visible=False)
def callback(arg):
global variable
global process_markup
variable = not variable
# change button style
if variable:
switchButton.update(label = 'Anticrossing ON',
button_type = 'success')
else:
switchButton.update(label = 'Anticrossing OFF',
button_type = 'default')
# show "calculating..."
process_markup.update(visible=True)
# do long calculations
x, y = calculate_data(variable)
source.data = {"x":x, "y":y}
# hide "calculating..."
process_markup.update(visible=False)
switchButton.on_click(callback)
col = column(switchButton, process_markup)
curdoc().add_root(row(col, p))