Python 3.x 为什么我的root.after命令不能在循环中工作?
当我运行程序并单击按钮时,消息只显示一次,而不是逐渐显示。原因是您没有创建闭包。因此,当触发之后对Python 3.x 为什么我的root.after命令不能在循环中工作?,python-3.x,tkinter,Python 3.x,Tkinter,当我运行程序并单击按钮时,消息只显示一次,而不是逐渐显示。原因是您没有创建闭包。因此,当触发之后对的第一次调用时,整个循环已经完成,i将被设置为字符串的长度。lambda使用当前值i,因此它将始终是循环中的最后一个值 一个非常简单的解决方案是使用i的当前值作为lambda函数参数的默认值,如下所示: import tkinter as tk task = ["Sire, a villager is asking for additional rations, saying her childr
的第一次调用时,整个循环已经完成,i
将被设置为字符串的长度。lambda使用当前值i
,因此它将始终是循环中的最后一个值
一个非常简单的解决方案是使用i
的当前值作为lambda函数参数的默认值,如下所示:
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()
然而,这比它需要的要复杂得多after
允许添加位置参数,因此根本不需要lambda
。您可以简单地将该声明归结为:
root.after(i*500, lambda i=i: x.set(task[0][0:i]))
root.after(i*500, x.set, task[0][0:i])