Python 删除内容后如何设置tkinter条目验证

Python 删除内容后如何设置tkinter条目验证,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我这里有几行代码来验证我的条目小部件,该小部件工作正常,但在删除内容并想将验证设置回原处后,它就不工作了。删除内容后,我可以键入文本,我不希望条目被接受 from tkinter import * def MoneyValidation(S): if S in ['0', '1', '2', '3', '4', '5']: return True root.bell() return False def delete(): vcmd_mon

我这里有几行代码来验证我的
条目
小部件,该小部件工作正常,但在删除内容并想将验证设置回原处后,它就不工作了。删除内容后,我可以键入
文本
,我不希望条目被接受

from tkinter import *


def MoneyValidation(S):
    if S in ['0', '1', '2', '3', '4', '5']:
        return True
    root.bell()
    return False


def delete():
    vcmd_money2 = (root.register(MoneyValidation), '%S')
    e.config(invcmd="keys", vcmd=vcmd_money2)
    e.delete(0, END)
    e.delete(0, END)

    vcmd_money = (root.register(MoneyValidation), '%S')
    e.config(validate="key", vcmd=vcmd_money)




root = Tk()

vcmd_money = (root.register(MoneyValidation), '%S')
e = Entry(root, validate="key", vcmd=vcmd_money)
e.pack()

b = Button(text="DELETE", command=delete)
b.pack()

root.mainloop()

我想你把这条路弄得太难了。只需关闭验证,删除文本,然后再次打开验证:

def delete():
    e.config(validate="none")
    e.delete(0, END)
    e.config(validate="key")

如果修改验证规则以允许一次删除多个字符,则根本不需要禁用验证。如果键入“123”并在不禁用验证的情况下运行
e.delete(0,END)
,则
MoneyValidation
的值将为“123”。如果单独验证S的每个字符,则可以允许进行此类多位数更改

from tkinter import *


def MoneyValidation(S):
    if all(c in ['0', '1', '2', '3', '4', '5'] for c in S):
        return True
    root.bell()
    return False

def delete():
    e.delete(0, END)

root = Tk()

vcmd_money = (root.register(MoneyValidation), '%S')
e = Entry(root, validate="key", vcmd=vcmd_money)
e.pack()

b = Button(text="DELETE", command=delete)
b.pack()

root.mainloop()

作为一个额外的好处,使用这种方法,用户可以突出显示其号码的一部分,并使用退格键将其删除。如果您保持MoneyValidation的原样,并且只在delete()调用期间禁用验证,那么这是不可能的。

找到了答案。怎么了?我觉得你的很简单,打得好。这还允许剪切和粘贴有效数字,从而使整个验证更加用户友好。