我是Python和Tkinter的新手,因此(可能)我可能会做一些愚蠢的事情。以下程序有效(验证函数对有效条目返回True,对无效条目返回False)除了一件事:oldvalue == newvalue always。如果我输入“xxx”,则打印出“错误!”但价值保持'xxx'。验证应该在更改发生之前进行,而错误的返回应该可以防止更改发生,对吗?
import Tkinter as tk
root = tk.Tk()
def makeEntries():
wnames = []
def f(name, newvalue, oldvalue):
name = name[name.rfind('.')+1:]
print 'validating', name, newvalue, oldvalue
for i, wn in enumerate(wnames):
if wn == name:
if newvalue.isdigit():
return True
else:
print 'wrong!'
return False
else:
raise RuntimeError('Kaput!')
vcmd = root.register(f)
frame = tk.Frame(root)
for i in range(10):
w = tk.Entry(frame, width=4, justify=tk.RIGHT,
validate='focusout',
validatecommand=(vcmd, '%W', '%P', '%s'))
w.pack()
name = w.winfo_name()
print i, name
wnames.append(name)
return frame
e = makeEntries()
e.pack()
root.mainloop()
答案 0 :(得分:0)
在"focusout"
上验证无法阻止错误值 - 验证机制不会删除窗口小部件中的字符。它只能防止在用户输入时输入字符。