TKINTER TUTORIAL
Chương trình "Hello, World!" bằng Tkinter trong Python Tìm hiểu cửa sổ Tkinter trong Python Tìm hiểu về các Widget Tkinter trong Python 3 cách đặt Options cho Widget Tkinter trong Python Ràng buộc lệnh trong Tkinter Tìm hiểu Event Binding của Tkinter trong Python Giới thiệu widget Label trong Tkinter Cách sử dụng widget Entry trong Tkinter Trình quản lý hình học Pack trong Tkinter Trình quản lý hình học Grid trong Tkinter Trình quản lý hình học Place trong Tkinter Kích thước Widget trong Tkinter Tìm hiểu về widget Frame trong Tkinter Cách sử dụng widget Text của Tkinter Tìm hiểu về widget Scrollbar của Tkinter Cách sử dụng widget ScrolledText của Tkinter Cách sử dụng widget Separator của Tkinter Cách sử dụng Widget Checkbox Trong Tkinter Cách sử dụng widget radio button của Tkinter Cách tạo widget combobox trong Tkinter Cách sử dụng widget Listbox trong Tkinter Sử dụng widget PanedWindow trong Tkinter Cách tạo widget Spinbox trong Tkinter Hướng dẫn sử dụng Slider trong Tkinter Cách sử dụng widget Sizegrip trong Tkinter Cách sử dụng widget LabelFrame trong Tkinter Cách sử dụng widget Progressbar trong Tkinter Cách sử dụng widget Notebook trong Tkinter Cách sử dụng về widget Treeview trong Tkinter Hướng dẫn về Canvas trong Tkinter Cách thiết lập con trỏ widget trong Tkinter. Window hướng đối tượng trong Tkinter Các Frame hướng đối tượng trong Tkinter Cách sử dụng Object-Oriented Application trong Tkinter Phương thức tkraise() của Frame trong Tkinter Các kiểu (Styles) trong Tkinter Cách thay đổi theme trong Tkinter Các element của ttk trong Tkinter Tìm hiểu về đối tượng Tkinter StringVar trong Tkinter Cách sử dụng phương thức map() của ttk.Style Cách sử dụng phương thức after() của Tkinter Cách sử dụng threads trong Tkinter Cách hiển thị progress bar khi thread đang chạy trong Tkinter. Cách tạo nhiều cửa sổ trong một Tkinter Cách sử dụng widget PhotoImage của Tkinter Cấu trúc MVC trong Tkinter Cách sử dụng Validate trong Tkinter Cách hiển thị đồ thị từ thư viện Matplotlib trong Tkinter Ứng dụng System Tray với Tkinter
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.

Cách sử dụng Validate trong Tkinter

Trong bài viết này, bạn sẽ tìm hiểu cách sử dụng tính năng Validate trong Tkinter, một công cụ giúp kiểm tra và xác nhận dữ liệu đầu vào của người dùng. Việc hiểu và áp dụng tính năng này không chỉ giúp đảm bảo tính chính xác của dữ liệu mà còn nâng cao trải nghiệm người dùng thông qua các cơ chế phản hồi trực quan và kịp thời.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Giới thiệu về tính năng xác thực trong Tkinter

Xác thực trong Tkinter dựa trên ba tùy chọn mà bạn có thể sử dụng cho bất kỳ widget nhập liệu nào, chẳng hạn như widget Entry:

  • validate: Xác định loại sự kiện nào sẽ kích hoạt xác thực.
  • validatecommand: Kiểm tra xem dữ liệu có hợp lệ không.
  • invalidcommand: Thực thi khi dữ liệu không hợp lệ. Nói cách khác, nó sẽ thực thi nếu validatecommand trả về False.

validate

Lệnh validate có thể là một trong các giá trị chuỗi sau:

  • 'focus': Xác thực bất cứ khi nào widget được nhận hoặc mất tiêu điểm.
  • 'focusin': Xác thực bất cứ khi nào widget nhận tiêu điểm.
  • 'focusout': Xác thực bất cứ khi nào widget mất tiêu điểm.
  • 'key': Xác thực bất cứ khi nào có thao tác nhấn phím thay đổi nội dung của widget.
  • 'all': Xác thực trong tất cả các tình huống trên: focus, focusout, và key.
  • 'none': Tắt xác thực. Đây là giá trị mặc định. Lưu ý rằng chuỗi 'none' không phải là giá trị None trong Python.

validatecommand

validatecommand là một tuple chứa:

Bài viết này được đăng tại [free tuts .net]

  • Một tham chiếu đến một hàm Tcl/tk.
  • Không hoặc nhiều mã thay thế chỉ định thông tin kích hoạt sự kiện mà bạn muốn truyền vào hàm.

Để có được tham chiếu đến một hàm Tcl/tk, bạn truyền một hàm callable vào phương thức widget.register(). Nó sẽ trả về một chuỗi mà bạn có thể sử dụng với validatecommand.

Bảng sau đây hiển thị các mã thay thế mà bạn có thể sử dụng với tuple:

  • '%d': Mã hành động: 0 cho xóa, 1 cho chèn, hoặc -1 nếu callback được gọi do focusin, focusout, hoặc thay đổi trong textvariable.
  • '%i': Khi người dùng cố gắng chèn hoặc xóa văn bản, đối số này sẽ là chỉ số của vị trí bắt đầu chèn hoặc xóa. Nếu callback được gọi do focusin, focusout, hoặc thay đổi trong textvariable, đối số sẽ là -1.
  • '%P': Giá trị mà văn bản sẽ có nếu thay đổi được phép.
  • '%s': Văn bản trong entry trước khi thay đổi.
  • '%S': Nếu cuộc gọi là do chèn hoặc xóa, đối số này sẽ là văn bản được chèn hoặc xóa.
  • '%v': Giá trị hiện tại của tùy chọn validate của widget.
  • '%V': Lý do cho callback này: một trong 'focusin', 'focusout', 'key', hoặc 'forced' nếu textvariable đã thay đổi.
  • '%W': Tên của widget.

Ví dụ sau đây xây dựng một validatecommand sử dụng phương thức self.validate() và mã thay thế '%P':

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

invalidcommand

Tương tự validatecommand, invalidcommand cũng yêu cầu sử dụng phương thức widget.register() và mã thay thế.

Ví dụ sau đây trả về một tuple mà bạn có thể truyền vào tùy chọn invalidcommand:

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

Ví dụ xác thực trong Tkinter

Chúng ta sẽ tạo một biểu mẫu chứa một trường nhập liệu email. Nếu bạn nhập một địa chỉ email không hợp lệ, chương trình sẽ hiển thị thông báo lỗi và thay đổi màu văn bản của trường email thành màu đỏ. Và chúng ta sẽ kích hoạt sự kiện xác thực khi tiêu điểm di chuyển ra khỏi entry.

Dưới đây là chương trình hoàn chỉnh:

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):
        """
        Xác thực trường nhập liệu email
        :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):
        """
        Hiển thị thông báo lỗi nếu dữ liệu không hợp lệ
        :return:
        """
        self.show_message('Vui lòng nhập email hợp lệ', 'red')

if __name__ == '__main__':
    app = App()
    app.mainloop()

Cách hoạt động

Đầu tiên, tạo lệnh xác thực sử dụng phương thức self.validate() và mã thay thế '%P':

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

Thứ hai, tạo lệnh invalidcommand sử dụng phương thức self.on_invalid:

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

Thứ ba, cấu hình widget entry để sử dụng xác thực, validatecommand, và invalidcommand:

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

Thứ tư, định nghĩa phương thức show_message() để thay đổi văn bản của widget label_error và màu văn bản của widget email_entry:

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

Thứ năm, định nghĩa phương thức validate() để xác thực giá trị của email_entry:

def validate(self, value):
    """
    Xác thực trường nhập liệu email
    :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
  • Phương thức validate() trả về True nếu văn bản đầu vào hợp lệ hoặc False nếu không. Trong trường hợp địa chỉ email hợp lệ, gọi phương thức show_message() để ẩn thông báo lỗi và đặt màu văn bản thành màu đen.

    Tkinter sẽ thực thi phương thức on_invalid() nếu văn bản đầu vào không phải là một địa chỉ email hợp lệ.

  • Cuối cùng, định nghĩa phương thức on_invalid() để hiển thị thông báo lỗi và đặt màu văn bản của widget email_entry thành màu đỏ:

def on_invalid(self):
    """
    Hiển thị thông báo lỗi nếu dữ liệu không hợp lệ
    :return:
    """
    self.show_message('Vui lòng nhập email hợp lệ', 'red')

Kết bài

Việc sử dụng các tùy chọn validate, validatecommand, và invalidcommand trong Tkinter là một cách hiệu quả để đảm bảo tính chính xác của dữ liệu đầu vào trong các ứng dụng. Bằng cách truyền các hàm kiểm tra qua phương thức widget.register(), bạn có thể kiểm soát chặt chẽ quá trình xác thực dữ liệu. Điều này không chỉ giúp ứng dụng của bạn hoạt động ổn định hơn mà còn mang lại trải nghiệm người dùng tốt hơn thông qua các phản hồi kịp thời và chính xác.

Cùng chuyên mục:

Hướng dẫn xây dựng Command-Line Interface (CLI) bằng Quo trong Python

Hướng dẫn xây dựng Command-Line Interface (CLI) bằng Quo trong Python

Hướng dẫn toàn diện về module datetime trong Python

Hướng dẫn toàn diện về module datetime trong Python

Cách truy cập và thiết lập biến môi trường trong Python

Cách truy cập và thiết lập biến môi trường trong Python

Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass

Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass

Từ khóa yield trong Python

Từ khóa yield trong Python

Sự khác biệt giữa sort() và sorted() trong Python

Sự khác biệt giữa sort() và sorted() trong Python

Sử dụng Poetry để quản lý dependencies trong Python

Sử dụng Poetry để quản lý dependencies trong Python

Định dạng chuỗi Strings trong Python

Định dạng chuỗi Strings trong Python

Một tác vụ phổ biến khi làm việc với danh sách trong Python

Một tác vụ phổ biến khi làm việc với danh sách trong Python

Làm việc với các biến môi trường trong Python

Làm việc với các biến môi trường trong Python

Sự khác biệt giữa set() và frozenset() trong Python

Sự khác biệt giữa set() và frozenset() trong Python

Sự khác biệt giữa iterator và iterable trong Python

Sự khác biệt giữa iterator và iterable trong Python

Cách làm việc với file tarball/tar trong Python

Cách làm việc với file tarball/tar trong Python

Chuyển đổi kiểu dữ liệu trong Python

Chuyển đổi kiểu dữ liệu trong Python

Sự khác biệt giữa toán tử == và is trong Python

Sự khác biệt giữa toán tử == và is trong Python

Làm việc với file ZIP trong Python

Làm việc với file ZIP trong Python

Cách sử dụng ThreadPoolExecutor trong Python

Cách sử dụng ThreadPoolExecutor trong Python

Sự khác biệt giữa byte objects và string trong Python

Sự khác biệt giữa byte objects và string trong Python

Xử lý độ chính xác các hàm floor, ceil, round, trunc, format  trong Python

Xử lý độ chính xác các hàm floor, ceil, round, trunc, format trong Python

Cách lặp qua nhiều list với hàm zip() trong Python

Cách lặp qua nhiều list với hàm zip() trong Python

Top