Tkinter Entry validatecommand未按预期工作

时间:2015-09-07 16:17:34

标签: python tkinter

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

1 个答案:

答案 0 :(得分:0)

"focusout"上验证无法阻止错误值 - 验证机制不会删除窗口小部件中的字符。它只能防止在用户输入时输入字符。