Причина в том, что вы не создаете замыкание. Поэтому, когда первый вызов after
сработал, весь l oop завершился, и i
будет установлен на длину строки. Ваша лямбда использует текущее значение i
, поэтому оно всегда будет последним значением из l oop.
. Действительно простое решение - использовать текущее значение i
в качестве значения по умолчанию. для параметра вашей лямбда-функции, например:
root.after(i*500, lambda i=i: x.set(task[0][0:i]))
Однако это намного сложнее, чем нужно. after
позволяет добавлять позиционные параметры, поэтому вам вообще не нужен lambda
. Вы можете просто сделать это утверждение так:
root.after(i*500, x.set, task[0][0:i])