作为我计划的一部分,我要求用户提供他们的姓名和班级(高中班级)。我正在使用一个成功接受输入的文本输入功能,但我需要验证方面的帮助:我只想让用户实际开始输入时“Enter”按钮变为活动状态,否则用户将按下“Enter”按钮停用它。此外,我想确保当他们输入他们的名字时,程序将只接受字母而不接受任何数字。对于第二个条目(学校班级/辅导班级),用户将输入类似6A1的东西,这是他们的班级。我的学校里有大约10个不同的高年级,所以我怎样才能验证参赛作品只接受这10个班级中的1个或者下拉菜单?非常感谢帮助:))
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)
enter_name = Entry(self)
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 = Entry(self)
tutor.pack()
tutor.focus_set()
Enter_0.config(state="disabled")
Enter_0_2 = Button(self, text="Enter", width=10, command=self.destroy)
Enter_0_2.pack()
Enter_0 = Button(self, text="Enter", width=10, command=callback)
Enter_0.pack()
答案 0 :(得分:2)
按照字面意思要求做的事情,“一旦用户实际开始输入”,“输入”按钮变为活动状态“是绑定enter_name
上的更改或按键事件,并激活{{1一旦它被触发。
但那可能不是你真正想要的。如果用户输入了一些文本然后将其删除,那么再次禁用该按钮会不会更好?如果用户在没有输入任何内容的情况下粘贴一些文本,那么不应该启用该按钮吗?
为此,您需要以下两种方法之一:验证或变量跟踪。
在我们开始之前,您几乎肯定会想要将Enter_0
按钮存储为Enter_0
上的属性,而不是在彼此之上创建和重新创建新按钮。所以,我会在我的例子中这样做。
验证虽然在Tkinter中记录得非常糟糕并且使用起来有点笨拙,但功能非常强大,而且非常适合您尝试做的事情 - 验证文本:
self
这可能看起来像是难以理解的魔法,Tkinter文档没有给你任何指导。但validatecommand
的Tk文档显示了它的含义:
def __init__(self, parent):
# existing stuff
vcmd = self.root.register(self.validate)
enter_name = Entry(self, validate='key', validatecommand=(vcmd, '%P'))
# existing stuff
self.Enter_0 = Button(self, text="Enter", width=10, command=callback)
self.Enter_0.pack()
def validate(self, P):
self.Enter_0.config(state=(NORMAL if P else DISABLED))
return True
位表示命令“将在编辑条目时调用”。key
表示“允许编辑时条目的值”。您可以将所有%P
字符串中的任意多个字符串粘贴到%
中,并将它们作为参数传递给vcmd
方法。因此,您可以传递validate
,然后定义(vcmd, '%s', '%P', '%v')
。validate(self, s, P, v)
或True
接受或拒绝更改(或返回False
以停止调用验证函数)。< / LI>
无论如何,现在,如果用户尝试以任何方式编辑条目,那么None
按钮将设置为Enter_0
,如果他们的编辑将为您提供非空字符串,{{ 1}}否则。
变量追踪在概念上非常笨拙,但在实践中往往更简单。它也没有完全记录,但至少它有点记录。
想法是创建一个StringVar
,将它附加到NORMAL
,并在其上放置一个“写跟踪”,这是一个每次更新变量时调用的函数(每次DISABLED
更改内容时都会发生。像这样:
Entry