如何验证文本输入以匹配预期输入?

时间:2014-01-03 14:36:13

标签: python validation user-interface tkinter tkinter-entry

我的程序的一部分询问用户他们的名字和班级(如在高中班级)。在第一个文本条目中,我希望程序只接受一个不超过10个字符的名称,但更重要的是只有字母。对于第二个文本条目,用户必须输入他们的类 - 程序应该期望以下之一:5A1,5A2,5B1,5B2,5C1,5C2 ... 6C1,6C2。

如何进行这些验证?

class Enter_Name_Window(tk.Toplevel):
'''A simple instruction window'''
def __init__(self, parent):
    tk.Toplevel.__init__(self, parent)
    self.text = tk.Label(self, width=40, height=2, text= "Please enter your name and class." )
    self.text.pack(side="top", fill="both", expand=True)


    name_var = StringVar()
    def validate_enter_0():
        self.Enter_0.config(state=(NORMAL if name_var.get() else DISABLED))
        print("validate enter worked")
    name_var.trace('w', lambda name, index, mode: validate_enter_0)
    enter_name = Entry(self, textvariable=name_var)
    enter_name.pack()
    enter_name.focus_set()


    def callback():
        self.display_name = tk.Label(self, width=40, height=2, text = "Now please enter your tutor group.")
        self.display_name.pack(side="top", fill="both", expand=True)


        tutor_var = StringVar()
        def validate_enter_2():
            self.Enter_0_2.config(state=(NORMAL if tutor_var.get() else DISABLED))
            print("validate enter worked")
        tutor_var.trace('w', lambda name, index, mode: validate_enter_0_2)
        tutor = Entry(self, textvariable=tutor_var)
        tutor.pack()
        tutor.focus_set()

        self.Enter_0.config(state="disabled")

        self.Enter_0_2 = Button(self, text="Enter", width=10, command=self.destroy)
        self.Enter_0_2.pack()


    self.Enter_0 = Button(self, text="Enter", width=10, command=callback)
    self.Enter_0.pack()

2 个答案:

答案 0 :(得分:1)

第一次检查

import string

if len(name) > 10 or any(l not in string.ascii_letters for l in name):
    # reject

第二次

if cls not in ["5A1", "5A2", ...]:
    # reject

或者你可以做一些更复杂的事情:

def validate_class(cls):
    if (len(cls) != 3 or 
        int(cls[0]) not in [5, 6] or
        cls[1] not in ["A", "B", "C"] or 
        int(cls[2]) not in [1, 2]):
        return False
    return True

这表达了有效类cls的更一般规则。

答案 1 :(得分:0)

条目小部件具有内置验证,它比变量跟踪更好。请参阅此答案以获取示例:

https://stackoverflow.com/a/4140988/7432

基本概念是您在修改窗口小部件时指定回调。验证功能可以发送回调各种有用的信息,例如插入(或删除)的字符,插入或删除前的值,后面的值等。您可以使用此信息来决定是否允许修改与否 - 如果回调返回False,则输入将被拒绝。

您也可以在此回调中执行其他操作,例如启用或禁用按钮。

执行此操作与跟踪文本变量的优势之一就在于,内置验证为您提供了大量有关决策的信息,并且在变量之前发生而不是后的