Вызов функции после вызова другой функции

Я программирую контроллер для использования с Ableton Live 8, используя API на основе Python. В моем коде я использую метод, предоставленный в API, для отслеживания изменений в значении свойства и вызываю функцию всякий раз, когда значение изменяется. Моя цель - изменить цвет клипа, когда будет замечено изменение значения.

Мой код завершен, и он компилируется без ошибок. Из журнала Эблтона:

742234 ms. RemoteScriptError: RuntimeError
742234 ms. RemoteScriptError: : 
742234 ms. RemoteScriptError: Changes cannot be triggered by notifications
742234 ms. RemoteScriptError: 

Похоже, что это результат использования встроенной системы уведомлений для внесения изменений в действующий набор во время уведомления. Запуск фактического изменения ПОСЛЕ того, как функция прослушивания закончила выполняться, должна работать. Возможно ли это с помощью Python?

Изменить для уточнения:

в настоящее время у нас есть

  1. замечено изменение значения, вызвана функция
  2. функция пытается изменить цвет клипов (приводит к ошибке)

нам нужно

  1. слушатель замечает изменение значения, вызывается функция
  2. функция находит новое значение цвета
  3. выполнение функции заканчивается
  4. другая функция вызывается за пределами области действия слушателя и изменяет цвет клипов

2 ответа

Я много сделал в M4L и знаю эту ошибку наизусть:) Боюсь, вы ничего не можете с этим поделать - на мой взгляд, это выглядит как встроенный механизм безопасности, так что вы не можете зацикливаться (Что-то изменилось? Измени это! Что-то изменилось...).

В M4L я использовал Javascript Tasks для разделения шагов (Tasks забывают почти все), что-то вроде

Наблюдатель -> Что-то изменилось

Создать задачу, которая реагирует

task.execute() или task.schedule(время)

Может быть, модуль Python Threading может достичь чего-то подобного? Кстати, если вам случится что-то понять о заданиях _Framework, дайте мне знать.

У меня возникла та же проблема при попытке удалить дорожку из прослушивателя остановки клипа, затем я нашел эту ветку и последовал предложению @user2323980.
Кажется, что есть объект "_tasks" в каждом классе Framework (я нашел его через log_message внутри ClipSlotComponent и ControlSurface), который обрабатывает параллелизм между задачами. И это действительно просто использовать:

self._tasks.add (Task.run (func, args))

Я нашел несколько вариантов его использования в скриптах Push и MK2, это хорошие ссылки.

Другие вопросы по тегам