Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Tìm hiểu về đối tượng Tkinter StringVar trong Tkinter
Trong bài bài này, bạn sẽ được giới thiệu về đối tượng Tkinter StringVar—một công cụ hữu ích trong việc quản lý và theo dõi giá trị của các widget như Label và Entry. Chúng ta sẽ cùng khám phá cách tạo, sử dụng StringVar để xử lý các giá trị động, cũng như cách tận dụng những tính năng theo dõi thay đổi của nó để làm cho ứng dụng Tkinter của bạn trở nên mạnh mẽ và tương tác hơn.
Giới thiệu về Tkinter StringVar
Tkinter StringVar giúp bạn quản lý giá trị của các widget như Label hoặc Entry một cách hiệu quả hơn.
Để tạo một đối tượng StringVar mới, bạn sử dụng hàm tạo của StringVar như sau:
string_var = tk.StringVar(container, value, name)
Hàm tạo StringVar chấp nhận ba đối số tùy chọn:
Bài viết này được đăng tại [free tuts .net]
container
: là widget mà đối tượng StringVar được liên kết. Nếu bạn bỏ qua container, mặc định sẽ là cửa sổ gốc (root window).value
: là giá trị ban đầu, mặc định là một chuỗi rỗng''
.name
: là tên Tcl, mặc định sẽ là PY_VARnum ví dụ: PY_VAR1, PY_VAR2, v.v.
Sau khi tạo đối tượng StringVar, bạn có thể gán nó cho thuộc tính textvariable
của một widget chấp nhận đối tượng StringVar.
Ví dụ, đoạn mã sau đây gán string_var
cho thuộc tính textvariable
của widget Entry:
name_entry = ttk.Entry(root, textvariable=string_var)
Để lấy giá trị hiện tại của widget Entry, bạn có thể sử dụng phương thức get()
của đối tượng StringVar:
name_var.get()
Đối tượng StringVar sẽ thông báo cho bạn bất cứ khi nào giá trị của nó thay đổi. Tính năng này rất hữu ích nếu bạn muốn tự động cập nhật các widget khác dựa trên giá trị hiện tại của đối tượng StringVar.
Để gọi một hàm callback bất cứ khi nào giá trị của một đối tượng StringVar thay đổi, bạn sử dụng phương thức trace()
của đối tượng StringVar:
string_var.trace('w', callback)
Chế độ 'w'
sẽ tự động gọi hàm callback bất cứ khi nào giá trị của string_var
thay đổi.
StringVar cũng cung cấp cho bạn hai chế độ khác là 'r'
và 'u'
:
'r'
(read) – gọi hàm callback bất cứ khi nào biến được đọc.'u'
(unset) – gọi hàm callback bất cứ khi nào biến bị xóa.
Ví dụ về Tkinter StringVar
Ví dụ sau đây minh họa cách sử dụng đối tượng StringVar cho widget Entry:
import tkinter as tk from tkinter import ttk class App(tk.Tk): def __init__(self): super().__init__() self.title('Tkinter StringVar') self.geometry("300x80") self.name_var = tk.StringVar() self.columnconfigure(0, weight=1) self.columnconfigure(1, weight=1) self.columnconfigure(2, weight=1) self.create_widgets() def create_widgets(self): padding = {'padx': 5, 'pady': 5} # Label ttk.Label(self, text='Name:').grid(column=0, row=0, **padding) # Entry name_entry = ttk.Entry(self, textvariable=self.name_var) name_entry.grid(column=1, row=0, **padding) name_entry.focus() # Button submit_button = ttk.Button(self, text='Submit', command=self.submit) submit_button.grid(column=2, row=0, **padding) # Output label self.output_label = ttk.Label(self) self.output_label.grid(column=0, row=1, columnspan=3, **padding) def submit(self): self.output_label.config(text=self.name_var.get()) if __name__ == "__main__": app = App() app.mainloop()
Kết quả:
Cách hoạt động của ví dụ:
Đầu tiên, tạo một đối tượng StringVar mới trong phương thức __init__()
của lớp App:
self.name_var = tk.StringVar()
Tiếp theo, gán đối tượng StringVar cho tùy chọn textvariable
của widget Entry trong phương thức create_widgets()
:
name_entry = ttk.Entry(self, textvariable=self.name_var)
Cuối cùng, đặt văn bản của widget output_label
thành giá trị của đối tượng name_var
khi nút bấm được nhấn:
self.output_label.config(text=self.name_var.get())
Ví dụ về theo dõi thay đổi văn bản StringVar trong Tkinter
Ví dụ sau minh họa cách sử dụng đối tượng StringVar để theo dõi sự thay đổi của văn bản.
Cửa sổ chính có hai widget Entry: mật khẩu và xác nhận mật khẩu. Nếu bạn nhập xác nhận mật khẩu khác với mật khẩu, một thông báo lỗi sẽ hiện lên. Nếu không, một thông báo thành công sẽ được hiển thị:
import tkinter as tk from tkinter import ttk class App(tk.Tk): ERROR = 'Error.TLabel' SUCCESS = 'Success.TLabel' def __init__(self): super().__init__() self.title('Change Password') self.geometry("300x130") self.password_var = tk.StringVar() self.confirm_password_var = tk.StringVar() self.confirm_password_var.trace('w', self.validate) self.columnconfigure(0, weight=1) self.columnconfigure(1, weight=1) self.columnconfigure(2, weight=1) # set style self.style = ttk.Style(self) self.style.configure('Error.TLabel', foreground='red') self.style.configure('Success.TLabel', foreground='green') self.create_widgets() def create_widgets(self): padding = {'padx': 5, 'pady': 5, 'sticky': tk.W} # message self.message_label = ttk.Label(self) self.message_label.grid(column=0, row=0, columnspan=3, **padding) # password ttk.Label(self, text='New Password:').grid(column=0, row=1, **padding) password_entry = ttk.Entry( self, textvariable=self.password_var, show='*') password_entry.grid(column=1, row=1, **padding) password_entry.focus() # Confirm password ttk.Label(self, text='Confirm Password:').grid( column=0, row=2, **padding) confirm_password = ttk.Entry( self, textvariable=self.confirm_password_var, show='*') confirm_password.grid(column=1, row=2, **padding) confirm_password.focus() # Change button submit_button = ttk.Button(self, text='Change') submit_button.grid(column=0, row=3, **padding) def set_message(self, message, type=None): """ đặt thông báo lỗi hoặc thành công """ self.message_label['text'] = message if type: self.message_label['style'] = type def validate(self, *args): """ xác nhận mật khẩu """ password = self.password_var.get() confirm_password = self.confirm_password_var.get() if confirm_password == password: self.set_message( "Success: The new password looks good!", self.SUCCESS) return if password.startswith(confirm_password): self.set_message('Warning: Keep entering the password') self.set_message("Error: Passwords don't match!", self.SUCCESS) if __name__ == "__main__": app = App() app.mainloop()
Kết quả:
Cách hoạt động của ví dụ:
Đầu tiên, xác định hai hằng số ERROR
và SUCCESS
để đặt cho message_label
dựa trên kết quả của việc xác nhận mật khẩu:
ERROR = 'Error.TLabel' SUCCESS = 'Success.TLabel'
Tiếp theo, tạo hai đối tượng StringVar:
self.password_var = tk.StringVar() self.confirm_password_var = tk.StringVar()
Sau đó, sử dụng phương thức trace()
để gọi phương thức self.validate()
bất cứ khi nào văn bản của widget xác nhận mật khẩu thay đổi:
self.confirm_password_var.trace('w', self.validate)
Cuối cùng, hiển thị thông báo thành công nếu mật khẩu trùng khớp trong phương thức validate()
. Nếu không, hiển thị thông báo cảnh báo nếu mật khẩu bắt đầu giống với mật khẩu xác nhận. Nếu mật khẩu không trùng khớp, hiển thị thông báo lỗi.
Kết bài
Qua bài bài viết này, bạn đã học cách sử dụng đối tượng Tkinter StringVar để quản lý giá trị của các widget một cách hiệu quả. Bằng cách gán StringVar cho thuộc tính textvariable
của widget, bạn có thể dễ dàng kiểm soát và truy xuất giá trị của chúng. Ngoài ra, với phương thức trace()
, bạn có thể theo dõi các thay đổi của văn bản, giúp ứng dụng của bạn trở nên linh hoạt và phản hồi nhanh hơn với những thay đổi từ người dùng. Những kỹ năng này sẽ giúp bạn xây dựng các ứng dụng Tkinter mạnh mẽ và tương tác hơn.