Python Bokeh:如何更新子例程中的切换按钮(在main中定义)

Python Bokeh:如何更新子例程中的切换按钮(在main中定义),python,bokeh,dashboard,Python,Bokeh,Dashboard,我有下面这个简单的bokeh示例。启动按钮启动子例程中的不定式while循环,按下按钮3或取消选中复选框后,该循环应立即停止运行。按钮2在没有循环的情况下检查状态,循环工作正常。由于button3和复选框cb在主菜单中定义,button1调用的子例程无法识别更改。有办法解决这个问题吗 我使用了bokeh版本1.0.1。您可以使用bokeh serve script.py运行该示例,并在浏览器()中查看它 我认为while环路干扰了龙卷风IO\u环路。我建议您改用add\u periodic\u

我有下面这个简单的bokeh示例。启动按钮启动子例程中的不定式while循环,按下按钮3或取消选中复选框后,该循环应立即停止运行。按钮2在没有循环的情况下检查状态,循环工作正常。由于button3和复选框cb在主菜单中定义,button1调用的子例程无法识别更改。有办法解决这个问题吗

我使用了bokeh版本1.0.1。您可以使用
bokeh serve script.py
运行该示例,并在浏览器()中查看它


我认为while环路干扰了龙卷风IO\u环路。我建议您改用
add\u periodic\u callback
(Bokeh v1.1.0)


确切地在回调中放置while循环会阻止一切,包括处理其他属性更改事件。谢谢。问题是,仪表板相当大,而while循环只是其中的一小部分。因此,不可能添加定期回调。除非可以仅为其中一个子项添加定期回调。在回调中,您应该执行所有(且仅)Bokeh绘图/小部件相关更新。对于其他功能,例如数据采集或处理,您可以自由添加其他异步线程并访问回调中的数据。我同意线程对于任何阻塞工作都是必要的
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))
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)