Ваш обратный вызов здесь на самом деле никогда не срабатывает. Это просто событие pointdraw, делающее свое дело.
При изменении source.data у вас должен быть триггер обратного вызова.
source.js_on_change('data', update)
Я сделал это для расстояния от первой точки, но вы могли бы сделать и от начала координат.
Если это из первой точки, вам необходимо каждый раз обновлять все расстояния (поскольку инструмент рисования позволяет перетаскивать существующие точки)
from bokeh.plotting import figure
from bokeh.io import output_file, show
from bokeh.models import DataTable, TableColumn, Column, PointDrawTool, ColumnDataSource, CustomJS
import pandas as pd
import numpy as np
output_file("tools_point_draw.html")
_tools_to_show = 'box_zoom,pan,save,hover,reset,tap'
p = figure(x_range=(0, 10), y_range=(0, 10), tools=_tools_to_show,
plot_width=862, plot_height=604,
title='Plot name')
p.background_fill_color = 'white'
d_true = {'x': [2, 3], 'y': [4, 1],
'color': ['red', 'red'],
'desc': ['true','true']}
df_true = pd.DataFrame(d_true)
df_true['distance'] = [0]+[np.sqrt((df_true['x'][i]-df_true['x'][i-1])**2+(df_true['y'][i]-df_true['y'][i-1])**2) for i in range(1,len(df_true['x']))]
source = ColumnDataSource(df_true)
renderer2 = p.scatter(x='x', y='y', source=source, color='color', size=15,
line_color='red', line_width=5)
renderer = p.line(x='x', y='y', source=source, color='red',
line_dash='dashed', line_width=10)
columns = [TableColumn(field="x", title="I am X"),
TableColumn(field="y", title="I am Y"),
TableColumn(field='color', title='color'),
TableColumn(field='desc', title='desc'),
TableColumn(field='distance', title='distance')]
update = CustomJS(args=dict(source_data=source), code="""
var data = source_data.data;
var res = 0;
//Sum of squares for euclidean
for(var i = 1; i < data['x'].length ; i++) {
res += Math.sqrt(Math.pow(data['x'][i] - data['x'][i-1], 2)+Math.pow(data['y'][i] - data['y'][i-1], 2));
//Update table
data['color'][i] = 'red';
data['desc'][i] = 'true';
data['distance'][i] = res;
}
source_data.change.emit();
""")
source.js_on_change('data', update)
table = DataTable(source=source, columns=columns, editable=True, height=200, width=862)
draw_tool = PointDrawTool(renderers=[renderer, renderer2])
p.add_tools(draw_tool)
p.toolbar.active_tap = draw_tool
show(Column(p, table))