Python / Bokeh - DataTable запускает функцию при выборе строки - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь получить DataTable, который будет выполнять обратный вызов, когда пользователь нажимает на определенную строку. Обратный вызов должен иметь значение первого столбца (для выбранной строки).

Попробовал несколько вещей, но ни одна из них не сработала:

from bokeh.layouts import widgetbox, row, column
from bokeh.models import ColumnDataSource, CustomJS
from bokeh.models.widgets import Button, RadioButtonGroup, RadioGroup, Tabs, \
    TextInput, Panel, Div, Select, DataTable, TableColumn, DateFormatter, \
    Slider

from bokeh.plotting import curdoc, show
import db_lib # database interaction
import dataAnalyzer

testBox = TextInput(title="test box", value = "start text")

# getting the data here:
data = {}
data["patients"] = {'kyma PT #': [1297, 1301, 1305, 1312], 'client PT #': [15072, 15255, 15228, 15077], 'patient name': ['John', 'David', 'Mark', 'Martin']}

patients_col = [
        TableColumn(field="kyma PT #", title="Kyma PT #", width = 50),
        TableColumn(field="client PT #", title="Client PT #", width = 50),
        TableColumn(field="patient name", title="Patient Name", width = 200),
    ]
patients_src = ColumnDataSource(data["patients"])

# method 1
source_code = """
row = cb_obj.indices[0]
testBox.update(value=patients_src.data["kyma PT #"][row])
"""
callback = CustomJS(args = dict(source = patients_src), code = source_code)
patients_src.selected.js_on_change('indices', callback)

layout = column(testBox)
show(layout)

Эта ошибка отображает: " Экземпляр Instance не имеет члена js_on_change, он работает без cra sh, но выбор в таблице ничего не делает. Также пробовал:

# method 2
def table_select(attr, old, new):
    testBox.update(value=patients_src.data["kyma PT #"][row])

patients_src.selected.on_change('indices', table_select)

То же самое, что и с первой попытки. И:

# method 3
def table_select(attr, old, new):
    testBox.update(value=patients_src.data["kyma PT #"][row])

patients_src.on_change('selected', table_select)

Здесь нет ошибки, но обратный вызов не запускается.

Стоит отметить, что я также запускаю его на сервере (curdo c ()), но результат тот же. Есть идеи, что я тут делаю не так?

1 Ответ

0 голосов
/ 04 мая 2020

Ваш код все еще неполон: есть некоторые импортированные несуществующие модули, и таблица нигде не найдена.

Однако, казалось, что их легко исправить. Основная проблема с вашим кодом заключается в том, что вы пишете код JavaScript для CustomJS, как если бы это был код Python.

Вот рабочая версия вашего кода:

from bokeh.layouts import column
from bokeh.models import ColumnDataSource, CustomJS, DataTable
from bokeh.models.widgets import TextInput, TableColumn

from bokeh.plotting import show

testBox = TextInput(title="test box", value="start text")

patients_col = [
    TableColumn(field="kyma PT #", title="Kyma PT #", width=50),
    TableColumn(field="client PT #", title="Client PT #", width=50),
    TableColumn(field="patient name", title="Patient Name", width=200),
]
patients_src = ColumnDataSource({'kyma PT #': [1297, 1301, 1305, 1312],
                                 'client PT #': [15072, 15255, 15228, 15077],
                                 'patient name': ['John', 'David', 'Mark', 'Martin']})

source_code = """
const row = cb_obj.indices[0];
testBox.value = source.data["kyma PT #"][row].toString();
"""
callback = CustomJS(args=dict(source=patients_src, testBox=testBox), code=source_code)
patients_src.selected.js_on_change('indices', callback)

layout = column(testBox, DataTable(columns=patients_col, source=patients_src))
show(layout)
...