Можно ли выполнить функцию без обновлений экрана? Python

def up():
    t.speed(1)
    t.goto(
        t.xcor(),
        t.ycor() + 10
    )

У меня есть функция up, которая занимает некоторое время в выполнении. Как сделать так, чтобы программа (при возможности) сразу показала результат выполнения без изменения скорости? То есть без обновлений экрана. Есть ли способ сделать так для любой функции вне зависимости от её содержания? Я имею ввиду не только черепашку, но и ожидание и т.д. Мне нужно чтобы так получалось не изменяя код функции, чтобы в конкретной ситуации можно было проиграть код мгновенно. Извините за то, что поздно объяснил.


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Управляйте скоростью рисования из кода с помощью turtle.tracer и turtle.delay:

def up():
    n = turtle.tracer()      # сохранить интервал рисования
    turtle.tracer(0)         # убрать рисование совсем
    delay = turtle.delay()   # сохранить задержку рисования
    turtle.delay(0)          # убрать задержку рисования

    # t.speed(1)
    t.goto(t.xcor(),t.ycor()+10)

    turtle.delay(delay)      # восстановить задержку рисования
    turtle.tracer(n)         # восстановить интервал рисования

Можно сделать декоратор, который до вызова функции включает полную скорость, а после выключает:

import functools
import turtle


def instant(f):

    @functools.wraps(f)
    def wrapper(*args, **kwds):
        n = turtle.tracer()      # сохранить интервал рисования
        turtle.tracer(0)         # убрать рисование совсем
        delay = turtle.delay()   # сохранить задержку рисования
        turtle.delay(0)          # убрать задержку рисования
        
        try:
            return f(*args, **kwds)
        finally:
            turtle.delay(delay)  # восстановить задержку рисования
            turtle.tracer(n)     # восстановить интервал рисования

    return wrapper


t = turtle.Turtle()


@instant
def up():
    # t.speed(1)
    t.goto(t.xcor(),t.ycor()+10)

Маленькое демо: четверть спирали черепашка рисует в обычном темпе, четверть максимально быстро:

def curve(k, t):
    for _ in range(90):
        t.forward(k)
        t.left(1)
        k += 0.001
    return k


def main():
    t = turtle.Turtle()
    k = 0.01
    for _ in range(100):
        k = curve(k, t)
        k = instant(curve)(k, t)


main()

введите сюда описание изображения

→ Ссылка