Обновление атрибута Bokeh не обновляет модель без удаления модели из curdoc

Приведенный ниже код является минимальным примером проблем, при которых модель боке не обновляется, когда ее атрибут устанавливается с помощью обратного вызова. Я обнаружил, что удаление и добавление объекта модели (даже подозрительного) из макета curdoc заставляет его обновляться. Я показал это через первое нажатие кнопки.

Есть ли более элегантный способ заставить боке перерисовать фигуру?

Пример для DataTable.columns.formatter, но я заметил, что это относится и к другим атрибутам модели (включая диапазоны осей, где я видел обходной путь, включающий явную настройку диапазона при создании рисунка, чтобы разрешить обновления).

from bokeh.models.widgets import Dropdown, RadioButtonGroup, CheckboxGroup, \
    Toggle, DataTable, TableColumn, NumberFormatter
from bokeh.plotting import figure, curdoc, ColumnDataSource
from bokeh.layouts import column, layout


def update_format(attr, old, new):
    if toggle_commas.active == 1:
        (t.columns[1].formatter)
        # remove the commas
        t.columns[1].formatter = NumberFormatter(format='0,0.[00]')
        # show that it updates the actual attribute
        print(t.columns[1].formatter)
        del doc_layout.children[-1]
        doc_layout.children.insert(1, toggle_commas)
    else:
        # change the formatter back and note that it doesn't update the table unless you remove and add something
        (t.columns[1].formatter)
        # remove the commas
        t.columns[1].formatter = NumberFormatter(format='0.[00]')
        # show that it updates the actual attribute
        print(t.columns[1].formatter)

table_data = dict(
        percentiles=['min', '1st', '5th', '10th', '25th', '50th',
                     '75th', '90th', '95th', '99th', 'max', '', 'mean', 'std'],
        values=[i for i in range(1000, 1014)]
    )
table_source = ColumnDataSource(table_data)
table_columns = [
    TableColumn(field="percentiles", title="Percentile"),
    TableColumn(field="values", title="Value", formatter=NumberFormatter(format='0.[00]'))
    ]

t = DataTable(source=table_source, columns=table_columns, width=400, height=600,
              name='pct_table')

toggle_commas = Toggle(label='Commas', active=False)
toggle_commas.on_change('active', update_format)

doc_layout = layout(t, toggle_commas)
curdoc().add_root(doc_layout)

0 ответов

Другие вопросы по тегам