Как реализовать обратный вызов javascripts для изменения заголовка графика Bokeh - PullRequest
0 голосов
/ 08 мая 2019

Я просто хочу позволить пользователю иметь возможность изменять заголовок графика Боке. Вот минимальный пример кода, который я пробовал. Проблема в том, как осуществляется обратный вызов.


from bokeh.io import show, output_file
from bokeh.plotting import figure
from bokeh.models import CustomJS, Button

fig = figure(title='title')
fig.line(x=[1,2,3], y=[1,2,3])


callback = CustomJS(args={'title':fig.title}, code="""title.text = text_input.get('value');
""")

text_input = TextInput(title="Add graph title", value='', callback=callback)


widgets_layout = column(text_input)


figures_layout = row(fig)


page_layout = row(widgets_layout, fig)


script, div = components(page_layout)
return render_to_response('fig.html', {'script': script, 'div': div})


Я не получаю никаких ошибок, но ничего не происходит при вводе нового заголовка в поле TextInput.

Есть идеи?

1 Ответ

2 голосов
/ 08 мая 2019

Синтаксис .get(...) был удален очень давно.В любой довольно свежей версии Bokeh просто зайдите, например, .value напрямую.Кроме того, для определения text_input внутри обратного вызова необходимо передать его в args.Вот обновленная версия вашего кода:

from bokeh.io import show
from bokeh.layouts import column, row
from bokeh.models import CustomJS, TextInput
from bokeh.plotting import figure


fig = figure(title='title')
fig.line(x=[1,2,3], y=[1,2,3])

text_input = TextInput(title="Add graph title", value='')
text_input.js_on_change('value', CustomJS(
    args={'title': fig.title, 'text_input': text_input},
    code="title.text = text_input.value"
))

widgets_layout = column(text_input)

figures_layout = row(fig)

show(row(widgets_layout, fig))

ОДНАКО, с Bokeh> = 1.1, вы можете просто использовать js_link и избегать создания всего CustomJS:

text_input = TextInput(title="Add graph title", value='')
text_input.js_link('value', fig.title, 'text')
...