Python 按下按钮后多次更改tkinter条目小部件

Python 按下按钮后多次更改tkinter条目小部件,python,python-3.x,tkinter,tkinter-entry,Python,Python 3.x,Tkinter,Tkinter Entry,我有一个tkinter Entry小部件,当用户按下按钮时,内容会更新: from tkinter import * window = Tk() def abcdef(num): ent.config(state=NORMAL) ent.delete(0, 'end') ent.insert(0, num) ent.config(state = "readonly") print(num) #Just to check the code is being

我有一个tkinter Entry小部件,当用户按下按钮时,内容会更新:

from tkinter import *
window = Tk()

def abcdef(num):
    ent.config(state=NORMAL)
    ent.delete(0, 'end')
    ent.insert(0, num)
    ent.config(state = "readonly")
    print(num) #Just to check the code is being run

def changeEntry():
    for j in range(3):
            ent.after(1000, abcdef(j))



ent = Entry(widow, text="", state = "readonly", readonlybackground="white", font = "20")
ent.grid(row = 0, column = 0, columnspan = 3, sticky = "E")

btn = Button(window, text="Button", command=changeEntry)
btn.grid(row = 1, column = 0, sticky = "NESW", pady = 10, padx = 10)

window.mainloop()
当我按下按钮时,窗口冻结3秒钟,然后只显示最后的数字。当用户按下按钮时,条目将每秒更改一次,而不是仅仅冻结3秒钟,只显示最后一个,我如何才能做到这一点


提前感谢

您有两个问题要解决。请在呼叫后解决。
.after
方法告诉Tkinter在时间间隔过后调用您传递给它的函数。但是你告诉Tkinter在1000毫秒后做3件事,所以它们都会发生在彼此的上面。所以你需要错开延迟

第二,您需要在调用函数时为
.after
提供一个要调用的函数。但是您的代码调用函数并在之后给出函数的返回值。我们可以通过将函数调用包装到另一个函数中来解决这个问题。一种方便的方法是使用
lambda
,给
lambda
一个默认参数,它可以传递给
abcdef

import tkinter as tk
window = tk.Tk()

def abcdef(num):
    ent.config(state=tk.NORMAL)
    ent.delete(0, 'end')
    ent.insert(0, num)
    ent.config(state = "readonly")
    print(num) #Just to check the code is being run

def changeEntry():
    for j in range(3):
            ent.after(1000 * j, lambda num=j: abcdef(num))


ent = tk.Entry(window, text="", state = "readonly", readonlybackground="white", font = "20")
ent.grid(row = 0, column = 0, columnspan = 3, sticky = "E")

btn = tk.Button(window, text="Button", command=changeEntry)
btn.grid(row = 1, column = 0, sticky = "NESW", pady = 10, padx = 10)

window.mainloop()
我还用整洁的
导入tkinter作为tk
替换了“star”导入。这就很明显哪些名称来自Tkinter,哪些名称是程序的本地名称


Bryan Oakley指出,我们不需要
lambda
,我们可以在函数名之后传入参数。有关详细信息,请参阅Tkinter文档中的。因此,我们可以像这样重新编写
changeEntry

def changeEntry():
    for j in range(3):
        ent.after(1000 * j, abcdef, j)

谢谢你,布莱恩

非常密切相关:相同的问题,只是在您的案例中它不是一个按钮命令。这里是
disp.after
的参数。什么是
disp
?您想在terminal中输出吗?@PratikKumar抱歉,这应该是Ent。在这种特定情况下,在调用
after
时,您不需要
lambda
。您可以传入其他参数:
ent.after(1000*j,abcdef,j)
@BryanOakley有趣!我模模糊糊地记得那件事,但我查看了文件,他们没有提到,所以我想我一定是在想象事情更正:我检查了事件文档,而不是
.after
文档。但我会更新我的答案。谢谢