我的程序的一部分询问用户他们的名字和班级(如在高中班级)。在第一个文本条目中,我希望程序只接受一个不超过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()
答案 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,则输入将被拒绝。
您也可以在此回调中执行其他操作,例如启用或禁用按钮。
执行此操作与跟踪文本变量的优势之一就在于,内置验证为您提供了大量有关决策的信息,并且在变量之前发生而不是后的 。