gpt4 book ai didi

python - 如何确保我的 ttk.Entry 的无效状态在失去焦点时不被清除?

转载 作者:太空狗 更新时间:2023-10-30 01:21:35 27 4
gpt4 key购买 nike

每当内容发生变化时,我想设置或清除 ttk.Entryinvalid 状态标志。我通过将 StringVar 连接到条目并在 trace() 回调中调用 state(['valid'])state(['!invalid'])。该标志由我的回调正确设置,但随后,只要焦点离开文本条目,它就会被清除!我该如何避免或解决这个问题?

我想设置或清除标志,因为我可以根据状态标志更改视觉样式。我不想禁止用户输入任何无效的内容;我希望他们可以自由地输入他们想要的任何内容,并立即查看它是否有效。我想专门使用 invalid 标志,而不是 alternate 标志,不仅因为 invalid 是更合乎逻辑的选择,还因为我'我已经将 alternate 标志用于其他用途。

我没有使用这个小部件的内置验证功能,因为根据 the Tk docs ,如果我在编辑文本时调用验证命令(-validate 等于 'keys''all'),

The entry will be prevalidated prior to each edit ... If prevalidation fails, the edit is rejected.

就像我之前说的,我不想那样。我想要 -validate 等于 'none' 应该做什么:

validation will only occur when specifically requested by the validate widget command.

太好了,所以理论上我所要做的就是永远不要调用 validate()。不幸的是,invalid 标志无论如何都会被清除。我可以在 Python 的交互模式下重现这种意外和不需要的行为:

>>> import tkinter as tk
>>> from tkinter import ttk
>>> win = tk.Tk()
>>> entry = ttk.Entry(win)
>>> entry.pack()
>>> entry['validate']
'none'
>>> entry.state()
()
>>> entry.state(['invalid'])
('!invalid',)
>>> entry.state()
('invalid',)

到目前为止,还不错。 (在此示例中我使用的是 Python 3,但我使用 Python 2 得到的结果相同。)现在我将焦点移到输入框和移出输入框,并且:

>>> entry.state()
()

为什么当 -validate'none' 而不是 'focus''all'?为了我的目的,我可以做些什么来使用 invalid 状态?

我在 Linux 上使用 Tcl/Tk 8.6 版的 Python 3.4.2 和 2.7.9 看到了同样的行为。

最佳答案

将您自己的绑定(bind)添加到 <FocusOut>它会调用您的验证函数并重置状态。

这是一个完整的工作示例。如果条目小部件包含单词“无效”,则状态将更改为“无效”。然后您可以点击小部件以查看状态仍然无效:

try:
import Tkinter as tk
import ttk
except ImportError:
import tkinter as tk
from tkinter import ttk

class Example(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)

# give invalid entries a red background
style = ttk.Style()
style.map("TEntry", background=[('invalid', "red")])

self.entryVar = tk.StringVar()
self.entry = ttk.Entry(self, textvariable=self.entryVar)

# this label will show the current state, updated
# every second.
self.label = tk.Label(self, anchor="w")
self.after_idle(self.updateLabel)

# layout the widgets
self.entry.pack(side="top", fill="x")
self.label.pack(side="bottom", fill="x")

# add trace on the variable to do custom validation
self.entryVar.trace("w", self.validate)

# set up bindings to also do the validation when we gain
# or lose focus
self.entry.bind("<FocusIn>", self.validate)
self.entry.bind("<FocusOut>", self.validate)

def updateLabel(self):
'''Display the current entry widget state'''
state = str(self.entry.state())
self.label.configure(text=state)
self.after(1000, self.updateLabel)

def validate(self, *args):
'''Validate the widget contents'''
value = self.entryVar.get()
if "invalid" in value:
self.entry.state(["invalid"])
else:
self.entry.state(["!invalid"])

if __name__ == "__main__":
root = tk.Tk()
Example(root).pack(fill="both", expand=True)
root.mainloop()

关于python - 如何确保我的 ttk.Entry 的无效状态在失去焦点时不被清除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30337351/

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