gpt4 book ai didi

python - 在 tk.Entry textvariable 上调用 tk.StringVar.set() 会导致 validate ="focusout"停止被调用

转载 作者:行者123 更新时间:2023-12-01 01:33:46 24 4
gpt4 key购买 nike

问题就在标题中,本质上是:如何在设置 Entry 的 textvariable 后继续调用 validatecommand 回调?这是最低工作示例 (MWE):

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

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

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

另一方面,如果您注释掉 sv.set('Set Text.') 代码,此行为将完全消失,并且回调将被调用任意多次。

How can I have the sv.set() functionality, while still maintaining the callback getting called every time the Entry widget loses focus?

最佳答案

这在 Tk manual page for entry 中进行了讨论:

The validate option will also set itself to none when you edit the entry widget from within either the validateCommand or the invalidCommand. Such editions will override the one that was being validated.

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

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

root.after_idle(lambda: e.config(validate="focusout"))

从回调中安排小部件的重新配置以再次启用验证(在更改源之后,使 e 是正确的 Entry 小部件,即不是第二个小部件) )。

关于python - 在 tk.Entry textvariable 上调用 tk.StringVar.set() 会导致 validate ="focusout"停止被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52571873/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com