作为我程序的一部分,我要求用户提供他们的名字和他们的班级(高中班)。我正在使用一个文本输入功能,它成功地接受了输入,但我需要验证方面的帮助:我只希望“回车”按钮在用户实际开始键入时变为活动状态,否则用户将按“回车”按钮并将其停用。另外,我想确保当他们输入自己的名字的程序将只接受字母,而不是数字在所有。对于第二个条目(学校类/家教类),用户将输入类似6A1的内容,这是他们的类。在我的学校有大约10个不同的高级班,所以我怎样才能验证条目以只接受这10个班中的一个,或者也许是一个下拉菜单?非常感谢您的帮助:)
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()
按照您的字面要求,“一旦用户实际开始键入,'Enter'按钮就变为活动”的方法是将更改或按键事件绑定到
enter_name
,并在触发后激活Enter_0
。你知道吗但这可能不是你真正想要的。如果用户输入一些文本,然后将其删除,如果再次禁用按钮不是更好吗?如果用户粘贴了一些文本而没有键入任何内容,那么不应该启用按钮吗?你知道吗
要做到这一点,您需要两件事之一:验证或变量跟踪。你知道吗
在我们开始之前,您几乎肯定会希望将
Enter_0
按钮作为属性存储在self
上,而不是在每个按钮上创建和重新创建新按钮。所以,我将在我的例子中这样做。你知道吗验证,虽然它在Tkinter中的文档记录非常糟糕,而且使用起来有点笨拙,但是它非常强大,并且非常适合您尝试执行的验证文本:
这可能看起来像不可读的魔法,而Tkinter文档没有给你任何指导。但是^{} 的Tk文档显示了它的含义:
key
位表示命令“在编辑条目时将被调用”。你知道吗%P
表示“允许编辑时的条目值”。您可以将任意多个%
字符串粘贴到vcmd
中,它们将作为参数传递给validate
方法。因此,您可以传递(vcmd, '%s', '%P', '%v')
,然后定义validate(self, s, P, v)
。你知道吗True
或False
以接受或拒绝更改(或返回None
以停止调用验证函数)。你知道吗无论如何,现在,如果用户试图以任何方式编辑条目,那么
Enter_0
按钮将被设置为NORMAL
,如果他们的编辑将给您一个非空字符串,否则DISABLED
。你知道吗变量跟踪在概念上要复杂得多,但在实践中往往更简单。它也没有完全的文档化,但至少有点文档化。你知道吗
其思想是创建一个^{} ,将其附加到
Entry
,并在其上放置一个“write trace”,这是一个每次变量更新时(每次Entry
更改内容时都会发生)调用的函数。像这样:相关问题 更多 >
编程相关推荐