Почему анимация tkinter настолько медленная, чем длиннее холст.create_text?

#python #tkinter #tkinter-canvas

Вопрос:

Поэтому я хотел сделать анимацию, в которой на экране будет отображаться очень длинная строка с кучей разрывов строк. Я заметил, что чем длиннее строка, особенно с разрывами строк, тем медленнее становится анимация.

Вот простой код, который работает быстро, потому что у меня есть только 1 строка строки плюс разрыв строки:

 from tkinter import *
def shift():
    canvas.move(text,0,1)
    canvas.after(1,shift)
root=Tk()
canvas=Canvas(root,bg='black')
canvas['width']=1920
canvas['height']=1080
canvas.pack(fill=BOTH, expand=1)
text_var="grtgliwjltjlk34jklsdgwelfjqwekfjlqkwejflkqwejflkqjwefkljqwelkfjl.n"
text=canvas.create_text(0,0,text=text_var,font=('Times New Roman',-58,'bold'),fill='white')
canvas.moveto(text,0,0)

shift()
root.mainloop()
 

Теперь, когда я умножаю строку на 100:

 text_var="grtgliwjltjlk34jklsdgwelfjqwekfjlqkwejflkqwejflkqjwefkljqwelkfjl.n"*100
 

Это просто супер медленно! Это как-то связано с tkinter? является ли это ограничением? Должен ли я использовать другую библиотеку? или я делаю что-то не так?

Комментарии:

1. Прямо сейчас вы пытаетесь перемещать текст 1000 раз в секунду (1000 кадров в секунду). Большинство людей не заметят, если вы попытаетесь перемещать текст 60 раз в секунду (60 кадров в секунду). Кроме того, вы пытаетесь перемещать текст со скоростью 1000 пикселей в секунду. Не слишком ли это много? Не забывайте, что .after время измеряется в миллисекундах.

2. @TheLizzard Ты прав, я не понимал, что 1000 кадров в секунду не нужны. Теперь все выглядит нормально, я сделал 60 кадров в секунду.

Ответ №1:

Проблема, по-видимому, связана с использованием пропорционального, а не моноширинного шрифта. В качестве быстрого эксперимента вы можете использовать font=('Consolas',-58,'bold') , и вы увидите, что он прокручивается намного быстрее, даже со 100 строками. (В этом случае вам может потребоваться изменить размер шрифта.)

При использовании немоноширинного шрифта Tkinter необходимо вычислить интервал для каждой строки. Использование чего-то подобного Consolas удаляет это вычисление.

Комментарии:

1. Это правда, я также заметил после изменения шрифтов, что разные шрифты по-разному влияли на медлительность. Но не совсем понимал, чем вызваны эти различия. Спасибо за это.