Python 按下按钮后多次更改tkinter条目小部件
我有一个tkinter Entry小部件,当用户按下按钮时,内容会更新: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
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
文档。但我会更新我的答案。谢谢