Tkinter Entry validatecommand未按预期工作

2024-06-16 11:25:59 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: namefalsetruereturntkinter错误条目root