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

2024-04-24 22:26:44 发布

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

我的程序的一部分要求用户提供他们的名字和班级(就像在高中课堂上)。在第一个文本输入我想程序只接受一个名称说不超过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()

Tags: textnameself程序configvardefwidth
2条回答

条目小部件具有内置的验证功能,比变量跟踪更有效。请参见此答案以获取示例:

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

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

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

与跟踪文本变量相比,这样做的好处很简单,内置验证为您提供了很多关于做出决策的信息,并且发生在之前,而不是之后。在

为了你的第一次检查

import string

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

第二次

^{pr2}$

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

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是什么的更一般的规则。在

相关问题 更多 >