如何在不触发多个回调的情况下同步Bokeh Wigets

时间:2018-12-31 07:49:56

标签: python callback widget bokeh

我在单独的标签上有四个图表。每个选项卡上都有一组滑块,并且每组滑块都是同步的。例如,如果更改了一个选项卡上的启动滑块,则使用以下回调函数设置所有(所有选项卡的)启动滑块:

def update_start(self, attr, old, new):
    print("Update Start")
    self.graph_start_time = new
    for ctrl in self.control_set:
        ctrl.start_slider.value = new
    self.update_source()

对于一组四个启动滑块,我看到print语句执行了五次。

我想首先在for循环中禁用每个回调,然后在for循环的每次迭代完成时重新启用它,但是我不知道如何。

我不明白的另一件事是为什么它不能作为无限递归循环运行。我假设第一个打印来自初始回调,接下来的四个来自for循环,每次迭代都对回调进行排队。如果是这种情况,则回调的每个队列都应该再次遇到for循环,这是无限的。但是它只执行五次,然后返回程序的正常运行。有人可以解释这是怎么回事吗?

1 个答案:

答案 0 :(得分:0)

我想出了这个临时解决方案。并非完全符合我的想法,但它能按我期望的那样工作:

def update_start(self, attr, old, new):
    if self.lockout_control_update_callback == False:
        self.lockout_control_update_callback = True
        print("Update Start")
        self.graph_start_time = new
        for ctrl in self.control_set:
            ctrl.start_slider.value = new
        self.lockout_control_update_callback = False
        self.update_source()

我仍在寻找更好的答案来禁用for循环中的回调,以及为什么原始内容不会无限期递归的原因。