Python Bokeh: как обновить кнопку Toggle - определенную в основном - в подпрограмме - PullRequest
0 голосов
/ 03 мая 2019

У меня есть следующий простой пример с боке. Кнопка запуска запускает бесконечный цикл while в подпрограмме, который должен прекратиться, как только будет нажата кнопка 3 или флажок снят. Button2 проверяет состояние без цикла, который работает нормально. Так как button3 и флажок cb определены в основном, подпрограмма, вызываемая button1, не распознает изменения. Есть ли способ решить это?

Я использовал боке версии 1.0.1. Вы можете запустить пример локально с помощью bokeh serve script.py и просмотреть его в своем браузере (http://localhost:5006).

from bokeh.models import Column
from bokeh.plotting import curdoc
from bokeh.models.widgets import Button, Toggle, CheckboxGroup
import time

def start_loop():
    while (not button3.active) and (len(cb.active)):
        time.sleep(1)
        print(button3.active)
        print(cb.active)

def check_status():
    print(button3.active)
    print(cb.active)

button1 = Button(label = "start")
button1.on_click(start_loop)

button2 = Button(label = "check status")
button2.on_click(check_status)

button3 = Toggle(label="stop")
cb = CheckboxGroup(labels=['stop'],active=[0])

curdoc().add_root(Column(button1,button2,button3,cb))

enter image description here

1 Ответ

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

Я думаю, что цикл while мешает IO_loop Tornado. Я советую вам использовать add_periodic_callback вместо (Bokeh v1.1.0)

from bokeh.models import Column
from bokeh.plotting import curdoc
from bokeh.models.widgets import Button, Toggle, CheckboxGroup
import time

# def start_loop():
#     while (not button3.active) and (len(cb.active)):
#         time.sleep(1)
#         print(button3.active)
#         print(cb.active)

def check_status():
    print(button3.active)
    print(cb.active)

# button1 = Button(label = "start")
# button1.on_click(start_loop)

button2 = Button(label = "check status")
button2.on_click(check_status)

button3 = Toggle(label = "stop")
cb = CheckboxGroup(labels = ['stop'], active = [0])

curdoc().add_root(Column(button2, button3, cb))
curdoc().add_periodic_callback(check_status, 1000)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...