如何为用户输入创建事件?

2024-05-19 01:44:07 发布

您现在位置:Python中文网/ 问答频道 /正文

作为我程序的一部分,我要求用户提供他们的名字和他们的班级(高中班)。我正在使用一个文本输入功能,它成功地接受了输入,但我需要验证方面的帮助:我只希望“回车”按钮在用户实际开始键入时变为活动状态,否则用户将按“回车”按钮并将其停用。另外,我想确保当他们输入自己的名字的程序将只接受字母,而不是数字在所有。对于第二个条目(学校类/家教类),用户将输入类似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()

Tags: text用户nameself程序条目名字width
1条回答
网友
1楼 · 发布于 2024-05-19 01:44:07

按照您的字面要求,“一旦用户实际开始键入,'Enter'按钮就变为活动”的方法是将更改或按键事件绑定到enter_name,并在触发后激活Enter_0。你知道吗

但这可能不是你真正想要的。如果用户输入一些文本,然后将其删除,如果再次禁用按钮不是更好吗?如果用户粘贴了一些文本而没有键入任何内容,那么不应该启用按钮吗?你知道吗

要做到这一点,您需要两件事之一:验证或变量跟踪。你知道吗


在我们开始之前,您几乎肯定会希望将Enter_0按钮作为属性存储在self上,而不是在每个按钮上创建和重新创建新按钮。所以,我将在我的例子中这样做。你知道吗


验证,虽然它在Tkinter中的文档记录非常糟糕,而且使用起来有点笨拙,但是它非常强大,并且非常适合您尝试执行的验证文本:

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

这可能看起来像不可读的魔法,而Tkinter文档没有给你任何指导。但是^{}的Tk文档显示了它的含义:

  • key位表示命令“在编辑条目时将被调用”。你知道吗
  • %P表示“允许编辑时的条目值”。您可以将任意多个%字符串粘贴到vcmd中,它们将作为参数传递给validate方法。因此,您可以传递(vcmd, '%s', '%P', '%v'),然后定义validate(self, s, P, v)。你知道吗
  • 可以在函数中执行任何操作,然后返回TrueFalse以接受或拒绝更改(或返回None以停止调用验证函数)。你知道吗

无论如何,现在,如果用户试图以任何方式编辑条目,那么Enter_0按钮将被设置为NORMAL,如果他们的编辑将给您一个非空字符串,否则DISABLED。你知道吗


变量跟踪在概念上要复杂得多,但在实践中往往更简单。它也没有完全的文档化,但至少有点文档化。你知道吗

其思想是创建一个^{},将其附加到Entry,并在其上放置一个“write trace”,这是一个每次变量更新时(每次Entry更改内容时都会发生)调用的函数。像这样:

def __init__(self, parent):

    # existing stuff

    name_var = StringVar()
    def validate_enter():
        self.Enter_0.config(state=(NORMAL if var.get() else DISABLED))
    name_var.trace('w', lambda name, index, mode: validate_enter)
    enter_name = Entry(self, textvariable=name_var)

    # existing stuff and again, do the self.Enter_0 change

相关问题 更多 >

    热门问题