Python使用Tkinter?GUI實現(xiàn)輸入驗證功能
輸入驗證
在本文中,將介紹如何使用 Tkinter 驗證來驗證用戶輸入。
1、Tkinter 驗證簡介
Tkinter 驗證依賴于可用于任何輸入小部件(例如 Entry 小部件)的三個選項:
- validate:指定哪種類型的事件將觸發(fā)驗證。
- validatecommand:檢查數(shù)據(jù)是否有效
- invalidcommand:當(dāng)數(shù)據(jù)無效時執(zhí)行。 換句話說,如果 validate 命令返回 False,它將執(zhí)行。
1.1 validate命令
validate 命令可以是以下字符串值之一:
| 名稱 | 描述 |
|---|---|
| ‘focus’ | 驗證小部件何時獲得或失去焦點 |
| ‘focusin’ | 每當(dāng)小部件獲得焦點時進(jìn)行驗證 |
| ‘focusout’ | 驗證小部件何時失去焦點 |
| ‘key’ | 每當(dāng)任何擊鍵更改小部件的內(nèi)容時進(jìn)行驗證 |
| ‘all’ | 在上述所有情況下驗證聚焦、聚焦和關(guān)鍵 |
| ‘none’ | 關(guān)閉驗證。 默認(rèn)設(shè)置 |
1.2 validatecommand
validatecommand 是一個元組,包含:
- 對 Tcl/tk 函數(shù)的引用。
- 零個或多個替換代碼指定觸發(fā)要傳遞給函數(shù)的事件的信息。
要獲取對 Tck/tk 函數(shù)的引用,請將可調(diào)用對象傳遞給 widget.register() 方法。 它返回一個可以與 validate 命令一起使用的字符串。
下表顯示了可用于元組的替換代碼:
| 名稱 | 描述 |
|---|---|
%d' | 操作代碼:0 表示嘗試刪除,1 表示嘗試插入,或 -1 如果調(diào)用回調(diào)以聚焦、聚焦或更改“文本變量” |
'%i' | 當(dāng)用戶試圖插入或刪除文本時,此參數(shù)將是插入或刪除開始的索引。 如果回調(diào)是由于聚焦、聚焦或更改“textvariable”,則參數(shù)將為“-1” |
'%P' | 如果允許更改,文本將具有的值 |
'%s' | 更改前Entry中的文本 |
'%S' | 如果調(diào)用是由于插入或刪除,此參數(shù)將是被插入或刪除的文本 |
'%v' | 小部件的 validate 選項的當(dāng)前值 |
'%V' | 此回調(diào)的原因:如果 textvariable 被更改,則為 'focusin'、'focusout'、'key' 或 'forced' 之一 |
'%W' | 小部件的名稱 |
以下示例構(gòu)造一個使用 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、完整示例
下面將創(chuàng)建一個包含電子郵件輸入的表單。 如果輸入了無效的電子郵件地址,它將顯示一條錯誤消息并將電子郵件輸入的文本顏色更改為紅色。 當(dāng)焦點移出條目時,我們將觸發(fā)驗證事件。
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 替換代碼創(chuàng)建一個驗證命令:
vcmd = (self.register(self.validate), '%P')
第二步,創(chuàng)建使用 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。 如果輸入文本是有效的電子郵件地址,請調(diào)用 show_message() 隱藏錯誤消息并將文本顏色設(shè)置為黑色。
如果輸入文本不是有效的電子郵件地址,Tkinter 將執(zhí)行 on_invalid() 方法。
最后,定義顯示錯誤消息的 on_invalid() 方法并將 email_entry 小部件的文本顏色設(shè)置為紅色。
def on_invalid(self):
"""
Show the error message if the data is not valid
:return:
"""
self.show_message('Please enter a valid email', 'red')到此這篇關(guān)于Python使用Tkinter GUI實現(xiàn)輸入驗證的文章就介紹到這了,更多相關(guān)Python Tkinter GUI輸入驗證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python3.6.5基于kerberos認(rèn)證的hive和hdfs連接調(diào)用方式
這篇文章主要介紹了python3.6.5基于kerberos認(rèn)證的hive和hdfs連接調(diào)用方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06
基于Python獲取docx/doc文件內(nèi)容代碼解析
這篇文章主要介紹了基于Python獲取docx/doc文件內(nèi)容代碼解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-02-02
Django請求響應(yīng)Web Http交互的核心機制深入理解
本文深入探討了 Django 中的請求與響應(yīng)處理,從 Django 請求和響應(yīng)的基礎(chǔ)知識、生命周期,到 HttpRequest 和 HttpResponse 對象的詳細(xì)介紹,同時,討論了 Django 的視圖和請求、響應(yīng)處理,以及安全性和異步處理的考慮2023-09-09
基于python3監(jiān)控服務(wù)器狀態(tài)進(jìn)行郵件報警
這篇文章主要介紹了基于python3監(jiān)控服務(wù)器狀態(tài)進(jìn)行郵件報警,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-10-10
Python實現(xiàn)用手機監(jiān)控遠(yuǎn)程控制電腦的方法
這篇文章主要介紹了Python實現(xiàn)用手機監(jiān)控遠(yuǎn)程控制電腦的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04

