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:

Cách sử dụng lớp QTreeWidget của PyQt

Cách sử dụng lớp QTreeWidget của PyQt

Cách sử dụng lớp QTableWidget để tạo một bảng

Cách sử dụng lớp QTableWidget để tạo một bảng

Cách sử dụng lớp QListWidget trong Python

Cách sử dụng lớp QListWidget trong Python

Cách dùng lớp QStatusBar trong PyQt để tạo thanh status bar

Cách dùng lớp QStatusBar trong PyQt để tạo thanh status bar

Cách dùng lớp QDockWidget của PyQt để tạo một widget

Cách dùng lớp QDockWidget của PyQt để tạo một widget

Cách dùng lớp PyQt QToolBar để tạo các widget toolbar

Cách dùng lớp PyQt QToolBar để tạo các widget toolbar

Cách sử dụng lớp PyQt QMenu để tạo menu

Cách sử dụng lớp PyQt QMenu để tạo menu

Cách sử dụng lớp QMainWindow của PyQt để tạo cửa sổ

Cách sử dụng lớp QMainWindow của PyQt để tạo cửa sổ

Cách dùng lớp PyQt QFileDialog để tạo hộp thoại chọn file

Cách dùng lớp PyQt QFileDialog để tạo hộp thoại chọn file

Cách dùng lớp PyQt QInputDialog để tạo một hộp thoại nhập liệu

Cách dùng lớp PyQt QInputDialog để tạo một hộp thoại nhập liệu

Cách sử dụng lớp PyQt QMessageBox để tạo một hộp thoại

Cách sử dụng lớp PyQt QMessageBox để tạo một hộp thoại

Cách sử dụng lớp PyQt QProgressBar để tạo một widget progress bar

Cách sử dụng lớp PyQt QProgressBar để tạo một widget progress bar

Cách dùng lớp PyQt QTextEdit để tạo một widget cho phép chỉnh sửa

Cách dùng lớp PyQt QTextEdit để tạo một widget cho phép chỉnh sửa

Cách dùng lớp PyQt QGroupBox để tạo một khung nhóm với tiêu đề

Cách dùng lớp PyQt QGroupBox để tạo một khung nhóm với tiêu đề

Cách dùng lớp PyQt QTabWidget để tạo một widget dạng tab

Cách dùng lớp PyQt QTabWidget để tạo một widget dạng tab

Cách dùng PyQt QWidget để làm container chứa các widget khác.

Cách dùng PyQt QWidget để làm container chứa các widget khác.

Cách sử dụng lớp PyQt QSlider để tạo một widget thanh trượt (slider).

Cách sử dụng lớp PyQt QSlider để tạo một widget thanh trượt (slider).

Cách tạo một widget nhập ngày và giờ sử dụng PyQt QDateTimeEdit

Cách tạo một widget nhập ngày và giờ sử dụng PyQt QDateTimeEdit

Cách tạo một widget nhập giờ sử dụng lớp PyQt QTimeEdit

Cách tạo một widget nhập giờ sử dụng lớp PyQt QTimeEdit

Cách tạo một widget nhập ngày sử dụng lớp PyQt QDateEdit

Cách tạo một widget nhập ngày sử dụng lớp PyQt QDateEdit

Top