Пробежимся по программе ещё раз, теперь целиком.
Снаружи функций – только то, что должно копиться: время и скорость. Объяви мы их внутри calculation_function, каждый кадр начинался бы с нуля и картинка стояла бы на месте.
restart возвращает состояние в начало. Библиотека сама её не зовёт – это делает кнопка, которую мы завели строкой add_button_param("Заново", restart). Обратите внимание: restart снова без скобок, передаём саму функцию.
Первая строка расчёта – ранний выход по паузе.
Параметры читаются каждый кадр, а не один раз в начале. Именно поэтому ползунок работает на ходу: сдвинули – следующий же кадр посчитается с новым значением.
Порядок двух строк с += здесь не важен, потому что ускорение зависит только от скорости. А вот в задачах, где ускорение зависит от координаты – маятник, гравитация, – порядок решает всё: там сначала обновляют координату по старой скорости, и только потом скорость по силе в новой точке. Этот порядок называется симплектическим методом Эйлера, и именно из-за него орбита в задаче про гравитацию замкнута, а не раскручивается по спирали.
main заканчивается почти сразу после run_gui_library. Дальше всё держится на повторных вызовах вашей функции.