Python Tkinter 中的 Entry 小部件验证

2025年3月17日 | 阅读 7 分钟

Python 编程语言提供了多种用于处理图形用户界面 (GUI) 应用程序的框架。Tkinter 或 Tk 接口是 Python 中最常用的接口之一,用于构建基于图形用户界面 (GUI) 的应用程序。某些应用程序需要验证文本字段,以防止用户在提交表单之前输入无效信息。Python 通过允许使用回调函数跟踪变量来实现输入验证。当输入被添加到 Tkinter 包的 Entry 小部件或从 Entry 小部件中删除时,就会调用此函数。

在接下来的教程中,我们将学习如何使用 Tkinter 包验证用户输入。

那么,让我们开始吧。

Tkinter 验证简介

验证在 Python Tkinter 中意味着正式声明用户输入可接受。换句话说,验证是指检查用户提供的信息是否符合要求。

主要有三种类型的验证:

  • 类型检查:此验证用于检查输入的_数据类型_。
  • 长度检查:此验证用于检查输入的_最小或最大长度_。
  • 范围检查:此验证用于检查输入的_范围_。

Python Tkinter 中的验证依赖于我们可以用于任何输入小部件(如 **Entry()** 小部件)的三个参数或属性:

  1. validate:此参数用于指定哪种类型的事件将触发验证。
  2. validatecommand:此参数用于检查数据是否有效。
  3. invalidcommand:当数据无效时,将执行此参数。换句话说,如果 **validatecommand** 参数的返回值是 False,它将执行。

现在,让我们简要了解这些参数或命令的一些基本概念。

validate 参数

validate 参数可以是以下字符串值之一:

序号。字符串值描述
1'focus'当小部件获得或失去焦点时,此字符串值进行验证。
2'focusin'当小部件获得焦点时,此字符串值进行验证。
3'focusout'当小部件失去焦点时,此字符串值进行验证。
4'key'当任何按键改变小部件的内容时,此字符串值进行验证。
5'all'此字符串值在上述所有情况下进行验证,例如 **'focusin'、'focusout'** 和 **'key'**。
6'none'此字符串值关闭验证。这是默认设置。
注意:字符串 **'none'** 与 Python 中的 **None** 值不同。

validatecommand 参数

validatecommand 参数是一个元组,包含:

  1. 指向 Tcl/Tk 函数的引用/地址。
  2. 零个或多个替换代码,用于指定我们希望传递到函数中的触发事件的信息。

我们将通过 **widget_name.register()** 方法传递一个可调用对象,以获取 Tcl/Tk 函数的引用。此方法将返回一个字符串,我们可以在 **validatecommand** 选项中使用。

让我们来看下面的表格,它显示了我们可以与元组一起使用的替换代码:

序号。替换代码描述
1%d操作代码:0 表示尝试删除,1 表示尝试插入,-1 表示回调函数因焦点进入、焦点退出或文本变量的更改而被调用。
2%i每当用户尝试删除或插入文本时,此参数将是插入或删除的起始索引。如果回调函数是由于焦点进入、焦点退出或参数更改而触发的,则参数为 -1。
3%P如果允许更改,文本将具有的值。
4%s更改前的文本。
5%S如果是由于删除或插入引起的调用,此参数将是被删除或插入的文本。
6%v小部件 validate 选项的当前值。
7%V如果文本变量被更改,则此回调是由于字符串值(即 **'focusin'、'focusout'、'key'** 或 **'forced'**)引起的。
8%W小部件的名称。

让我们考虑以下示例,使用 **self.validate()** 方法和 **%P** 替换代码来构建一个 **validatecommand** 选项:

示例

invalidcommand 参数

与 **validatecommand** 参数类似,**invalidcommand** 参数还需要使用 **widget_name.register()** 方法和替换代码。

让我们考虑以下示例,它通过传递到 **invalidcommand** 选项来返回一个元组:

示例

基于 Tkinter 验证的示例

在此示例中,我们将创建一个包含电子邮件输入的表单。如果输入的电子邮件地址无效,它将显示错误消息并更改电子邮件输入的颜色。此外,当焦点移出输入框时,我们将触发验证事件。

让我们来看以下代码片段,以了解上述陈述的实现。

程序代码

输出 1:如果输入的电子邮件地址有效。

Validating Entry Widget in Python Tkinter

输出 2:如果输入的电子邮件地址无效。

Validating Entry Widget in Python Tkinter

上述示例中的验证是如何工作的?

首先,我们使用 **self.validate()** 方法和 **%P** 替换代码创建了一个 **validate** 命令。

语法

其次,我们创建了使用 **self.on_invalid()** 方法的 **invalidcommand** 命令。

语法

接下来,我们配置了使用 **validate、validatecommand** 和 **invalidcommand** 参数的 Entry 小部件。

语法

此外,我们定义了 **displayMessage()** 方法,该方法会更改 **error_label** 小部件的文本以及 **email_field** 小部件的文本颜色。

语法

然后,我们定义了另一个方法 **validate()**,该方法执行对 **email_field** 小部件的值的验证。

语法

上述代码片段中的 **validate()** 方法在输入文本有效时返回 **True**;否则,它返回 **False**。如果输入的文本是有效的电子邮件地址,则调用 **displayMessage()** 方法来隐藏错误消息并将文本颜色设置为黑色。

如果输入的文本被证明是无效的电子邮件地址,Tkinter 将运行 **on_invalid()** 方法。

最后,我们定义了 **on_invalid()** 方法来显示错误消息并将 **email_field** 小部件的文本颜色设置为红色。

语法

结论

  1. Tkinter 包在任何输入小部件上都使用 **validate**、**validatecommand** 和 **invalidcommand** 参数来验证输入数据。
  2. 我们需要将一个可调用对象传递给 **register()** 方法,才能为 **validatecommand** 和 **invalidacommand** 参数创建命令。
  3. **validatecommand** 参数在数据有效时返回 **True**,而在数据无效时返回 **False**。
  4. **invalidcommand** 参数将在数据无效或 **validatecommand** 参数返回 **False** 时执行。

下一个主题Python 随机打乱