Python 对tk.Entry textvariable调用tk.StringVar.set()会导致validate=";“聚焦输出”;停止被叫

Python 对tk.Entry textvariable调用tk.StringVar.set()会导致validate=";“聚焦输出”;停止被叫,python,python-3.x,tkinter,callback,tkinter-entry,Python,Python 3.x,Tkinter,Callback,Tkinter Entry,问题在标题中,本质上是:在设置条目的textvariable之后,如何让validatecommand回调继续被调用?以下是最小工作示例(MWE): 注意,第二个tk.Entry小部件允许第一个小部件失去焦点,这就是我们试图捕获的事件 正如现在的代码一样,当您运行它时,您可以更改顶部条目小部件的文本一次。它将正确地设置为设置文本。然后,如果您再次尝试更改条目的文本,新文本将出现在小部件中,但回调不会发生 另一方面,如果注释掉sv.set('set Text')code,则此行为将完全消失,回调将

问题在标题中,本质上是:在设置条目的
textvariable
之后,如何让
validatecommand
回调继续被调用?以下是最小工作示例(MWE):

注意,第二个
tk.Entry
小部件允许第一个小部件失去焦点,这就是我们试图捕获的事件

正如现在的代码一样,当您运行它时,您可以更改顶部条目小部件的文本一次。它将正确地设置为
设置文本。
然后,如果您再次尝试更改条目的文本,新文本将出现在小部件中,但回调不会发生

另一方面,如果注释掉
sv.set('set Text')
code,则此行为将完全消失,回调将被调用任意次数

我怎样才能拥有
sv.set()

以下章节对此进行了讨论:

当您从
validateCommand
invalidCommand
中编辑条目小部件时,
validate
选项也将自身设置为
none
。此类版本将覆盖正在验证的版本

这样做大概是为了避免无限递归

您可以在空闲{%W config-validate%v}
后运行此命令(而不是给定的Tcl代码,


从回调中计划重新配置小部件以再次启用验证(更改源代码后,使
e
是正确的
条目
小部件,即不是第二个)。

完美!正是我需要的。多谢!
import tkinter as tk

root = tk.Tk()
sv = tk.StringVar()


def callback():
    print(sv.get())
    sv.set('Set Text.')
    return True


e = tk.Entry(root, textvariable=sv, validate="focusout",                 
             validatecommand=callback)
e.grid()
e = tk.Entry(root)
e.grid()
root.mainloop()
root.after_idle(lambda: e.config(validate="focusout"))