0

我的程序的一部分要求用户提供他们的姓名和班级(如高中班级)。在第一个文本条目中,我希望程序只接受不超过 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()
4

2 回答 2

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

于 2014-01-03T14:38:43.120 回答
0

入口小部件具有内置验证,比变量跟踪效果更好。有关示例,请参见此答案:

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

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

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

与跟踪文本变量相比,这样做的优势在于,内置验证为您提供了大量信息以供您做出决定,并且发生变量更改之前而不是之后

于 2014-01-03T15:06:33.123 回答