Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 为什么我的root.after命令不能在循环中工作?_Python 3.x_Tkinter - Fatal编程技术网

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])