我正在为Python / Tkinter应用程序设计一个“设置”框架,让用户可以指定IP地址,端口号和其他几个可配置选项。我想在让用户关闭框架之前验证用户条目。
根据我在Entry
窗口小部件的validate
和validatecommand
选项中读到(并尝试过)的内容,他们提供的唯一选择是“严厉”验证。阻止用户离开Entry小部件(甚至键入任何其他按键)直到条目有效的类型。这正是我在设计GUI时避免的行为,因为它让用户感到烦恼。
我打算切换到使用.trace方法来监视值,只是禁用“确定/应用”按钮,直到帧中的所有条目都有效。在我这样做之前,我想知道我是否遗漏了与内置验证选项有关的任何内容。我错过了一个不太沉重的选择吗?
答案 0 :(得分:2)
您可以使用验证功能而无需“严厉”。在设置好/应用按钮的状态后,您的验证始终返回True。
答案 1 :(得分:1)
如果您使用跟踪,那么您可以拥有所需的内容而无需使用Tkinter的验证。使所有跟踪转到相同的功能,您可以根据需要测试和验证所有值,并根据启用或禁用确定按钮。
答案 2 :(得分:1)
我不确定你应该这样做,但是你可以附加一个invalidcommand
处理程序,它将对条目起作用,好像一切正常。
示例脚本:
import Tkinter as tk
def onvalidate(d,i,P,s,S,v,V,W):
# only lowercase is valid
valid = (P.lower() == P)
# set red background if invalid
newcolor = 'red' if not valid else default_color
root.nametowidget(W).configure(background=newcolor)
return valid
def oninvalid(d,i,P,s,S,v,V,W):
#called if widget is invalid
widget = root.nametowidget(W)
# S is the character that *would* have been
# inserted or deleted, but won't because it is invalid
# So we do it ourselves
if S:
if d=='0':
widget.delete(i, len(S))
elif d=='1':
widget.insert(i, S)
# Changing the text clears the 'validate' value
# so we have to reset it
widget.after_idle(lambda W,v: root.nametowidget(W).configure(validate=v), W, v)
root = tk.Tk()
valhook = (root.register(onvalidate), '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')
invhook = (root.register(oninvalid), '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')
entry = tk.Entry(root, validate="key", validatecommand=valhook, invalidcommand=invhook)
default_color = entry.cget('background')
entry.pack()
root.mainloop()
如果没有,这将创建一个红色背景的条目,如果没有,则创建一个白色背景,但即使条目无效,仍会插入或删除文本。