Python中如何使用Tkinter验证来验证用户输入
Admin 2022-09-15 群英技术资讯 966 次浏览
这篇文章给大家介绍了“Python中如何使用Tkinter验证来验证用户输入”的相关知识,讲解详细,步骤过程清晰,有一定的借鉴学习价值,因此分享给大家做个参考,感兴趣的朋友接下来一起跟随小编看看吧。在本文中,将介绍如何使用 Tkinter 验证来验证用户输入。
Tkinter 验证依赖于可用于任何输入小部件(例如 Entry 小部件)的三个选项:
validate 命令可以是以下字符串值之一:
| 名称 | 描述 |
|---|---|
| ‘focus’ | 验证小部件何时获得或失去焦点 |
| ‘focusin’ | 每当小部件获得焦点时进行验证 |
| ‘focusout’ | 验证小部件何时失去焦点 |
| ‘key’ | 每当任何击键更改小部件的内容时进行验证 |
| ‘all’ | 在上述所有情况下验证聚焦、聚焦和关键 |
| ‘none’ | 关闭验证。 默认设置 |
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')
与 validatecommand 一样,invalidcommand 也需要使用 widget.register() 方法和替换代码。
以下示例返回一个元组,您可以将其传递给 invalidcommand 选项:
ivcmd = (self.register(self.on_invalid),)
下面将创建一个包含电子邮件输入的表单。 如果输入了无效的电子邮件地址,它将显示一条错误消息并将电子邮件输入的文本颜色更改为红色。 当焦点移出条目时,我们将触发验证事件。
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),)
第三步,配置使用validation、validatecommand和invalidatecommand的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')
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块,下面这篇文章主要给大家介绍了关于Python中条件语句、循环语句和pass语句使用的相关资料,需要的朋友可以参考下
这篇文章主要介绍了Django csrf校验的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Python index()方法检测字符串中是否包含子字符串str ,如果指定beg(开始)和end(结束)范围,则检查是否包含在指定范围内,该方法与python find()方法一样,只不过如果str不在string中会报一个异常。
python 有str object 和 unicode object 两种字符串, 都可以存放字符的字节编码,但是他们是不同的type,这一点很重要,也是为什么
这篇文章主要介绍了Python中静态方法,类方法,属性方法使用方法,文章围绕主题的相关资料展开详细内容,具有一定的参考价值,需要的小伙伴可以参考一下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008