Советы по отладке боке - PullRequest
0 голосов
/ 17 мая 2019

Мое приложение стало довольно сложным, около 1500 строк в нескольких файлах. Есть кнопка, которая создает вкладки и добавляет их на существующую панель. Вот минимальный рабочий пример того, как работает кнопка:

def create_new_tab():
    paragraph = Paragraph(text="Hello!")
    tab = Panel(child=paragraph, title="tab")
    tab.closable = True
    return tab

def append_new_tab():
    new_tab = create_new_tab()
    curdoc().select_one({'name': 'tabs'}).tabs.append(new_tab)

button = Button(label='append new tab')
button.on_click(append_new_tab)

tab1 = Panel(child=button, title='button tab')
tabs = Tabs(tabs = [tab1], name='tabs')
curdoc().add_root(tabs)

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

сообщение об ошибке обработки сообщения «СОБЫТИЕ» (редакция 1) содержимое: '{"имя_ события": "button_click", "событие_значения": {"модель_ид": "1002"}}': RuntimeError ('Установить измененный размер во время итерации »)

Я потратил некоторое время на попытки отладки, но безуспешно. Я попытался создать минимальный не работающий пример, но все мои минимальные примеры работают. Я продолжаю смотреть на сообщение об ошибке и задаюсь вопросом, что еще я могу сделать, чтобы выяснить, что идет не так?

Примечание: я уже использую bokeh serve myapp/ --dev

1 Ответ

1 голос
/ 17 мая 2019

Вы можете отлаживать свое приложение, используя этот код (Bokehh v1.1.0):

from bokeh.models import Panel, Tabs, Button, Paragraph
from tornado.ioloop import IOLoop
from bokeh.server.server import Server
from bokeh.application import Application
from bokeh.application.handlers.function import FunctionHandler

def modify_doc(doc):

    def create_new_tab():
        paragraph = Paragraph(text="Hello!")
        tab = Panel(child=paragraph, title="tab")
        tab.closable = True
        return tab

    def append_new_tab():
        new_tab = create_new_tab()
        doc.select_one({'name': 'tabs'}).tabs.append(new_tab)

    button = Button(label='append new tab')
    button.on_click(append_new_tab)

    tab1 = Panel(child=button, title='button tab')
    tabs = Tabs(tabs = [tab1], name='tabs')
    doc.add_root(tabs)

io_loop = IOLoop.current()
server = Server(applications = {'/app': Application(FunctionHandler(modify_doc))}, io_loop = io_loop, port = 5001)
server.start()
server.show('/app')
io_loop.start() 
...