Почему моя команда root .after не работает в al oop? - PullRequest
0 голосов
/ 14 апреля 2020
import tkinter as tk

task = ["Sire, a villager is asking for additional rations, saying her children are starving"]


root = tk.Tk()
root.title("Test")
root.geometry("900x400")

x = tk.StringVar()

problem = tk.Label(root, textvariable=x, bg='white')
problem.place(rely = 0.5, relx= 0.5, anchor="center")

def show():
    for i in range(len(task[0])+1):
        root.after(i*500, lambda: x.set(task[0][0:i]))


b = tk.Button(root, text="Go", bg='white', command=show)
b.place(rely = 0.6, relx = 0.5, anchor="center")

root.configure(background='white')
root.mainloop()

Когда я запускаю программу и нажимаю кнопку, сообщение появляется только один раз, а не постепенно.

1 Ответ

1 голос
/ 15 апреля 2020

Причина в том, что вы не создаете замыкание. Поэтому, когда первый вызов 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])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...