網站首頁 編程語言 正文
輸入驗證
在本文中,將介紹如何使用 Tkinter 驗證來驗證用戶輸入。
1、Tkinter 驗證簡介
Tkinter 驗證依賴于可用于任何輸入小部件(例如 Entry 小部件)的三個選項:
- validate:指定哪種類型的事件將觸發驗證。
- validatecommand:檢查數據是否有效
- invalidcommand:當數據無效時執行。 換句話說,如果 validate 命令返回 False,它將執行。
1.1 validate命令
validate 命令可以是以下字符串值之一:
名稱 | 描述 |
---|---|
‘focus’ | 驗證小部件何時獲得或失去焦點 |
‘focusin’ | 每當小部件獲得焦點時進行驗證 |
‘focusout’ | 驗證小部件何時失去焦點 |
‘key’ | 每當任何擊鍵更改小部件的內容時進行驗證 |
‘all’ | 在上述所有情況下驗證聚焦、聚焦和關鍵 |
‘none’ | 關閉驗證。 默認設置 |
1.2 validatecommand
validatecommand 是一個元組,包含:
- 對 Tcl/tk 函數的引用。
- 零個或多個替換代碼指定觸發要傳遞給函數的事件的信息。
要獲取對 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),)
第三步,配置使用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')
原文鏈接:https://blog.csdn.net/wujuxKkoolerter/article/details/124443427
相關推薦
- 2022-07-27 使用Docker將容器打成鏡像的方法步驟_docker
- 2022-04-12 Apache?Pulsar集群搭建部署詳細過程_Linux
- 2022-12-21 使用RedisAtomicInteger計數出現少計問題及解決_Redis
- 2022-11-05 關于Python?Tkinter?復選框?->Checkbutton_python
- 2022-06-01 C++的matlab接口轉換方法詳解_C 語言
- 2022-07-21 centos docker容器優化清理磁盤空間以及內存占用
- 2022-07-04 聯邦學習FedAvg中模型聚合過程的理解分析_其它綜合
- 2022-12-22 OpenHarmony如何調用電話服務API撥打電話_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支