2016-02-25 4 views
2

как можно обновить переменную python extern_python_variable при перемещении ползунка в примере ниже? Значение extern_python_variable всегда должно быть f (фактическое положение ползунка). Благодаря!Как обновить глобальную переменную python в функции customJS в bokeh?

from bokeh.io import vform 
from bokeh.models import CustomJS, ColumnDataSource, Slider 
from bokeh.plotting import Figure, output_file, show 

output_file("callback.html") 


x = [x*0.005 for x in range(0, 200)] 
y = x 

extern_python_variable=0 

source = ColumnDataSource(data=dict(x=x, y=y)) 

plot = Figure(plot_width=400, plot_height=400) 
plot.line('x', 'y', source=source, line_width=3, line_alpha=0.6) 

callback = CustomJS(args=dict(source=source), code=""" 
     var data = source.get('data'); 
     var f = cb_obj.get('value') 
     x = data['x'] 
     y = data['y'] 
     for (i = 0; i < x.length; i++) { 
      y[i] = Math.pow(x[i], f) 
     } 
     source.trigger('change'); 
    """) 

slider = Slider(start=0.1, end=4, value=1, step=.1, title="power", callback=callback) 

test=source.to_df() 

layout = vform(slider, plot) 

show(layout) 
+0

Выходом этого кода является HTML-файлом, который содержит JavaScript для техники взаимодействия , Таким образом, он будет запущен в браузере, и он запустит javascript в вашем браузере, он не будет запускать какую-либо подпрограмму python. Мне интересно, что вы собираетесь делать с extern_python_variable? если вы хотите контролировать значение f, вы можете открыть консоль javascript в браузере, и вы можете сбрасывать любую информацию там, используя console.log (variable_to_monitor); –

+0

Приведенный выше код должен быть простым примером. В реальности я хочу сохранить атрибуты rect из выбора в переменных python, и мне нужны переменные для дальнейших вычислений, ориентированных на базу данных, которые не могут быть выполнены в функции customJS. – justus

ответ

1

я вижу до трех способов сделать то, что вы хотите:

1) с помощью сервера Бока вы можете реагировать на события инструмента и синхронизацию с вычислениями, сделанных в питоне. (См Running a Bokeh Server)

2) Если вы все еще хотите использовать статические HTML-страницу, а затем, после того, как событие инструмента, вы можете отправить данные на сервер (может быть локальным) с использованием XMLHttpRequest (см Using XMLHttpRequest), который затем будет дождитесь ответа с сервера. Сервер может иметь сценарий python CGI (см. Python CGI Programming), считывая данные, отправленные XMLHttpRequest, и возвращает некоторые значения в CustomJS, где был выполнен запрос.

3) Третий рудиментарный способ может открыть пустую веб-страницу и выгрузить данные там, используя функцию document.write (см. Window open() Method). Затем вы копируете и вставляете данные в свой скрипт python или ipython для анализа.

+0

Отлично! Спасибо Пабло. Я проверю ваше предложение на сервере Bokeh. – justus

0

Мне нравится метод, представленный в сценарии widget в примерах внедрения bokeh.

Обратный вызов CustomJS выполняется только в браузере (код Python не выполняется). См here

В качестве примера, используя сервер Бока, вы можете добавить следующую строку в ваш код, чтобы получить питон обратного вызова:

def update(attr, old, new): 
    # your custom python code 

slider = Slider(start=0.1, end=4, value=1, step=.1, title="power") 
slider.on_change('value', update) 
Смежные вопросы