Как синхронизировать виджеты Bokeh без запуска нескольких обратных вызовов - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть четыре графика на отдельных вкладках.На каждой вкладке есть набор ползунков, и каждый набор ползунков синхронизируется.Например, если начальный слайдер на одной вкладке изменяется, то все стартовые слайдеры (для всех вкладок) устанавливаются с помощью этой функции обратного вызова:

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 голосов
/ 31 декабря 2018

Я придумал это временное решение.Не совсем то, что я имел в виду, но это работает так, как я и ожидал:

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 и причину, по которой оригиналне повторяется бесконечно.

...