Câu trả lời đúng là, sử dụng validatecommand
thuộc tính của tiện ích con. Thật không may, tính năng này ít được ghi lại trong thế giới Tkinter, mặc dù nó được ghi lại khá đầy đủ trong thế giới Tk. Mặc dù nó không được ghi chép đầy đủ, nhưng nó có mọi thứ bạn cần để xác thực mà không cần dùng đến các ràng buộc hoặc biến truy tìm hoặc sửa đổi tiện ích con từ bên trong thủ tục xác thực.
Bí quyết là bạn có thể yêu cầu Tkinter chuyển các giá trị đặc biệt vào lệnh xác thực của mình. Các giá trị này cung cấp cho bạn tất cả thông tin bạn cần biết để quyết định xem dữ liệu có hợp lệ hay không: giá trị trước khi chỉnh sửa, giá trị sau khi chỉnh sửa nếu chỉnh sửa hợp lệ và một số bit thông tin khác. Tuy nhiên, để sử dụng chúng, bạn cần thực hiện một chút voodoo để chuyển thông tin này tới lệnh xác thực của bạn.
Lưu ý: điều quan trọng là lệnh xác thực trả về True
hoặc False
. Bất kỳ điều gì khác sẽ khiến cho tiện ích con bị tắt xác thực.
Đây là một ví dụ chỉ cho phép viết thường (và in tất cả các giá trị sôi nổi đó):
import tkinter as tk
class Example(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
vcmd = (self.register(self.onValidate),
'%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')
self.entry = tk.Entry(self, validate="key", validatecommand=vcmd)
self.text = tk.Text(self, height=10, width=40)
self.entry.pack(side="top", fill="x")
self.text.pack(side="bottom", fill="both", expand=True)
def onValidate(self, d, i, P, s, S, v, V, W):
self.text.delete("1.0", "end")
self.text.insert("end","OnValidate:\n")
self.text.insert("end","d='%s'\n" % d)
self.text.insert("end","i='%s'\n" % i)
self.text.insert("end","P='%s'\n" % P)
self.text.insert("end","s='%s'\n" % s)
self.text.insert("end","S='%s'\n" % S)
self.text.insert("end","v='%s'\n" % v)
self.text.insert("end","V='%s'\n" % V)
self.text.insert("end","W='%s'\n" % W)
if S == S.lower():
return True
else:
self.bell()
return False
if __name__ == "__main__":
root = tk.Tk()
Example(root).pack(fill="both", expand=True)
root.mainloop()
Để biết thêm thông tin về những gì sẽ xảy ra khi bạn gọi register
phương thức, hãy xem Xác thực đầu vào tkinter