文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python使用Tkinter GUI实现输入验证功能

2024-04-02 19:55

关注

输入验证

在本文中,将介绍如何使用 Tkinter 验证来验证用户输入。

1、Tkinter 验证简介

Tkinter 验证依赖于可用于任何输入小部件(例如 Entry 小部件)的三个选项:

1.1 validate命令

validate 命令可以是以下字符串值之一:

名称描述
‘focus’验证小部件何时获得或失去焦点
‘focusin’每当小部件获得焦点时进行验证
‘focusout’验证小部件何时失去焦点
‘key’每当任何击键更改小部件的内容时进行验证
‘all’在上述所有情况下验证聚焦、聚焦和关键
‘none’关闭验证。 默认设置

1.2 validatecommand

validatecommand 是一个元组,包含:

要获取对 Tck/tk 函数的引用,请将可调用对象传递给 widget.register() 方法。 它返回一个可以与 validate 命令一起使用的字符串。

下表显示了可用于元组的替换代码:

名称描述
%d'操作代码:0 表示尝试删除,1 表示尝试插入,或 -1 如果调用回调以聚焦、聚焦或更改“文本变量”
'%i'当用户试图插入或删除文本时,此参数将是插入或删除开始的索引。 如果回调是由于聚焦、聚焦或更改“textvariable”,则参数将为“-1”
'%P'如果允许更改,文本将具有的值
'%s'更改前Entry中的文本
'%S'如果调用是由于插入或删除,此参数将是被插入或删除的文本
'%v'小部件的 validate 选项的当前值
'%V'此回调的原因:如果 textvariable 被更改,则为 'focusin''focusout''key''forced' 之一
'%W'小部件的名称

以下示例构造一个使用 self.validate() 方法和 %P 替换代码的 validatecommand:

vcmd = (self.register(self.validate), '%P')

1.3 invalidcommand

与 validatecommand 一样,invalidcommand 也需要使用 widget.register() 方法和替换代码。

以下示例返回一个元组,您可以将其传递给 invalidcommand 选项:

ivcmd = (self.register(self.on_invalid),)

2、完整示例

下面将创建一个包含电子邮件输入的表单。 如果输入了无效的电子邮件地址,它将显示一条错误消息并将电子邮件输入的文本颜色更改为红色。 当焦点移出条目时,我们将触发验证事件。

import tkinter as tk
from tkinter import ttk
import re

class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title('Tkinter Validation Demo')
        self.create_widgets()
    def create_widgets(self):
        self.columnconfigure(0, weight=1)
        self.columnconfigure(1, weight=3)
        self.columnconfigure(2, weight=1)
        # label
        ttk.Label(text='Email:').grid(row=0, column=0, padx=5, pady=5)
        # email entry
        vcmd = (self.register(self.validate), '%P')
        ivcmd = (self.register(self.on_invalid),)
        self.email_entry = ttk.Entry(self, width=50)
        self.email_entry.config(validate='focusout', validatecommand=vcmd, invalidcommand=ivcmd)
        self.email_entry.grid(row=0, column=1, columnspan=2, padx=5)
        self.label_error = ttk.Label(self, foreground='red')
        self.label_error.grid(row=1, column=1, sticky=tk.W, padx=5)
        # button
        self.send_button = ttk.Button(text='Send').grid(row=0, column=4, padx=5)
    def show_message(self, error='', color='black'):
        self.label_error['text'] = error
        self.email_entry['foreground'] = color
    def validate(self, value):
        """
        Validat the email entry
        :param value:
        :return:
        pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
        if re.fullmatch(pattern, value) is None:
            return False
        self.show_message()
        return True
    def on_invalid(self):
        Show the error message if the data is not valid
        self.show_message('Please enter a valid email', 'red')
if __name__ == '__main__':
    app = App()
    app.mainloop()

示例代码如何工作?

第一步,使用 self.validate() 方法和 %P 替换代码创建一个验证命令:

vcmd = (self.register(self.validate), '%P')

第二步,创建使用 self.on_invalid 方法的 invalidatecommand:

ivcmd = (self.register(self.on_invalid),)

第三步,配置使用validationvalidatecommandinvalidatecommand的Entry小部件:

self.email_entry.config(validate='focusout', validatecommand=vcmd, invalidcommand=ivcmd)

第四步,定义改变 label_error 小部件的文本和 email_entry 小部件的文本颜色的 show_message() 方法:

def show_message(self, error='', color='black'):
    self.label_error['text'] = error
    self.email_entry['foreground'] = color

第五步,定义验证 email_entry 值的 validate() 方法。

def validate(self, value):
    """
    Validat the email entry
    :param value:
    :return:
    """
    pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
    if re.fullmatch(pattern, value) is None:
        return False
    self.show_message()
    return True

如果输入文本有效,则 validate() 方法返回 True,否则返回 False。 如果输入文本是有效的电子邮件地址,请调用 show_message() 隐藏错误消息并将文本颜色设置为黑色。

如果输入文本不是有效的电子邮件地址,Tkinter 将执行 on_invalid() 方法。

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

def on_invalid(self):
    """
    Show the error message if the data is not valid
    :return:
    """
    self.show_message('Please enter a valid email', 'red')

到此这篇关于Python使用Tkinter GUI实现输入验证的文章就介绍到这了,更多相关Python Tkinter GUI输入验证内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯