from bokeh.io import curdoc
from bokeh.layouts import widgetbox
from bokeh.models import ColumnDataSource, Slider, DataTable, TableColumn

init_i = 6


def get_square(n):
    return dict(x=list(range(n)), y=[_ ** 2 for _ in range(n)])


source = ColumnDataSource(get_square(init_i))
columns = [
    TableColumn(field="x", title="x"),
    TableColumn(field="y", title="x**2"),
]

table = DataTable(source=source, columns=columns, width=320)
i_slider = Slider(start=2, end=10, value=init_i, step=1, title="i")


def update_data(attrname, old, new):
    i = i_slider.value
    table.source = ColumnDataSource(get_square(i))
    table.update()


for w in [i_slider]:
    w.on_change('value', update_data)

curdoc().add_root(widgetbox(i_slider, table))
