如何为用户输入创建活动?

时间:2013-12-16 22:15:38

标签: python events input menu tkinter

作为我计划的一部分,我要求用户提供他们的姓名和班级(高中班级)。我正在使用一个成功接受输入的文本输入功能,但我需要验证方面的帮助:我只想让用户实际开始输入时“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()

1 个答案:

答案 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