обновление панели не имеет никакого эффекта

#python #bokeh

#python #боке

Вопрос:

Я хотел бы обновить панель, но это не имеет эффекта. Столбец обновления и текст обновления, с другой стороны, работают нормально. panel.update Сломан?

В моем приложении вкладка содержит несколько графиков. Один из графиков необходимо периодически заменять новым графиком (я не могу просто обновить данные столбца).

  • bokeh==2.2.1

минимальный рабочий пример:

 
from bokeh.plotting import curdoc
from bokeh.models import Tabs, Paragraph, Panel
from bokeh.layouts import column


COUNTER = 0
PAR = Paragraph(text='initial paragraph')
COLUMN = column(children=[PAR])
PANEL = Panel(child=COLUMN, title='response time')


def update_column():
    global COUNTER, COLUMN
    
    par = Paragraph(text=f'counter = {COUNTER}')
    COLUMN.update(children=[par])
    COUNTER  = 1
    
    print("update column done")
    

def update_panel():
    global COUNTER, PANEL
    
    par = Paragraph(text=f'counter = {COUNTER}')
    PANEL.update(child=column(children=[par]))
    COUNTER  = 1
    
    print("update panel done")
    

def update_text():
    global COUNTER, PAR

    PAR.update(text=f'counter = {COUNTER}')
    COUNTER  = 1
    
    print("update text done")


doc = curdoc()
panels = []
tabs = Tabs(tabs=[PANEL])

doc.add_periodic_callback(callback=update_panel, period_milliseconds=1000)
doc.add_root(tabs)
  
  • callback=update_column работает
  • callback=update_text работает
  • callback=update_panel не работает

Ответ №1:

Обновления Panel свойств вообще не подключаются. Пожалуйста, создайте проблему на GitHub, если вам нужна эта функциональность.

В качестве обходного пути вы можете обернуть child панель в столбец, а затем обновить children свойство этого столбца:

 from bokeh.io import curdoc
from bokeh.layouts import column
from bokeh.models import Tabs, Panel, Div, Button

p = Panel(title='Panel', child=column(Div(text='Panel content')))
ts = Tabs(tabs=[p])

b = Button(label='Update panel content')


def update_panel():
    p.child.children = [Div(text='Updated panel content')]


b.on_click(update_panel)

curdoc().add_root(column(ts, b))
  

Комментарии:

1. «необходимость» относительна. Я могу легко обойти это, просто интересно, не упускаю ли я чего-то, поскольку на панели есть метод обновления.