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.
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 dofocusin
,focusout
, hoặc thay đổi trongtextvariable
.'%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 dofocusin
,focusout
, hoặc thay đổi trongtextvariable
, đố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 trongentry
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ọnvalidate
của widget.'%V'
: Lý do cho callback này: một trong'focusin'
,'focusout'
,'key'
, hoặc'forced'
nếutextvariable
đã 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ặcFalse
nếu không. Trong trường hợp địa chỉ email hợp lệ, gọi phương thứcshow_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 widgetemail_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.