我正在努力验证一些条目小部件,在SO和google上浏览各种帖子。修改了Bryan O.代码几乎可以工作。当输入文本是一位数时,验证失败 - 为什么? 2个或更多,它成功。
我的更改是检查数字而不是小写字母。当然,原始代码的确如宣传的那样。
import Tkinter as tk
def onvalidate(d,i,P,s,S,v,V,W):
# only lowercase is valid
# valid = (P.lower() == P)
valid = P.isdigit()
print 'P is:', type(P), P
print 'valid is:', valid
# 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()
方法2(更简单的代码):仅适用于输入的第一个字符,其他故障。我知道S是当前的char,P是允许编辑的,但我很确定我想在这里检查S.为什么它不适用于在该领域输入的所有内容?
import Tkinter as tk
def OnValidate(d, i, P, s, S, v, V, W):
print "OnValidate:"
print "d='%s'" % d
print "i='%s'" % i
print "P='%s'" % P
print "s='%s'" % s
print "S='%s'" % S
print "v='%s'" % v
print "V='%s'" % V
print "W='%s'" % W
# only allow if the string is lowercase
# return (S.lower() == S)
print 'S is:', S, type(S)
if S.isdigit():
print 'Check:', S.isdigit()
return S
else:
pass
root = tk.Tk()
vcmd = (root.register(OnValidate),
'%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')
entry = tk.Entry(root, validate="key",
validatecommand=vcmd)
entry.pack()
root.mainloop()
答案 0 :(得分:0)
您的验证功能必须返回True
或False
,告知tkinter是否允许编辑。如果它返回任何其他内容,则将关闭验证。
if S.isdigit():
return True
else:
False