日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Python使用Tkinter?GUI實現輸入驗證功能_python

作者:視覺智能 ? 更新時間: 2022-06-26 編程語言

輸入驗證

在本文中,將介紹如何使用 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、validatecommandinvalidatecommand的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

欄目分類
最近更新