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 Event Binding của Tkinter trong Python
Trong lập trình giao diện người dùng với Tkinter, việc xử lý các sự kiện như nhấn phím, nhấp chuột, và di chuyển con trỏ là một phần quan trọng để tạo ra những ứng dụng tương tác. Tkinter cung cấp cơ chế Event Binding cho phép lập trình viên gắn các hàm xử lý với các sự kiện cụ thể trên các widget. Điều này giúp ứng dụng phản hồi linh hoạt và kịp thời trước các thao tác của người dùng. Trong bài viết này, mình sẽ tìm hiểu chi tiết về cách Event Binding trong Tkinter, từ cơ bản đến nâng cao, cùng với các ví dụ minh họa để bạn có thể áp dụng vào các dự án của mình.
Giới thiệu về Event Binding trong Tkinter
Event Binding là việc gán một hàm để xử lý một sự kiện xảy ra trên widget. Khi sự kiện đó xảy ra, hàm được gán sẽ tự động được gọi để xử lý sự kiện.
Trong hướng dẫn trước, bạn đã học cách ràng buộc một hàm với sự kiện của widget thông qua tùy chọn command
. Tuy nhiên, không phải tất cả các widget trong Tkinter đều hỗ trợ tùy chọn này.
Do đó, Tkinter cung cấp một phương thức khác để Event Binding thông qua phương thức bind()
.
Bài viết này được đăng tại [free tuts .net]
Phương thức bind()
có cú pháp chung như sau:
widget.bind(event, handler, add=None)
Khi sự kiện xảy ra trên widget, Tkinter sẽ tự động gọi hàm handler
với thông tin chi tiết về sự kiện.
Nếu bạn muốn đăng ký thêm một hàm xử lý, bạn có thể truyền giá trị '+'
cho tham số add
. Điều này cho phép bạn có nhiều hàm xử lý sự kiện cùng phản hồi cho một sự kiện.
Ví dụ về Event Binding trong Tkinter
Chương trình dưới đây minh họa cách ràng buộc hàm return_pressed
với sự kiện nhấn phím Return trên nút "Save":
import tkinter as tk from tkinter import ttk def return_pressed(event): print('Phím Return đã được nhấn.') root = tk.Tk() btn = ttk.Button(root, text='Save') btn.bind('<Return>', return_pressed) btn.focus() btn.pack(expand=True) root.mainloop()
Trong ví dụ này, dòng lệnh sau gọi phương thức bind()
trên widget btn
để Event Binding nhấn phím Return:
btn.bind('<Return>', return_pressed)
Ví dụ tiếp theo minh họa cách sử dụng phương thức bind()
để đăng ký nhiều hàm xử lý cho cùng một sự kiện:
import tkinter as tk from tkinter import ttk def return_pressed(event): print('Phím Return đã được nhấn.') def log(event): print(event) root = tk.Tk() btn = ttk.Button(root, text='Save') btn.bind('<Return>', return_pressed) btn.bind('<Return>', log, add='+') btn.focus() btn.pack(expand=True) root.mainloop()
Khi bạn di chuyển con trỏ đến nút và nhấn phím Return, Tkinter sẽ tự động gọi các hàm return_pressed
và log
.
Câu lệnh sau đây ràng buộc hàm log()
với sự kiện nhấn phím Return trên nút "Save":
btn.bind('<Return>', log, add='+')
Trong câu lệnh này, tham số thứ ba add='+'
đăng ký thêm hàm log()
như là một hàm xử lý bổ sung.
Nếu không chỉ định tham số add='+'
, phương thức bind()
sẽ thay thế hàm xử lý hiện có (return_pressed
) bằng hàm mới (log
).
Mẫu Event Tkinter trong Python
Tkinter sử dụng các mẫu sự kiện để ánh xạ tên sự kiện với các hàm xử lý. Ví dụ, <Return>
đại diện cho sự kiện nhấn phím Return.
Cú pháp chung của một mẫu sự kiện như sau:
<modifier-type-detail>
Trong cú pháp này, sự kiện được bao quanh bởi các dấu ngoặc nhọn (<>). Bên trong các dấu ngoặc nhọn, có thể có không hoặc nhiều bộ điều chỉnh (modifier), một loại sự kiện và thông tin chi tiết về sự kiện.
Ví dụ, <KeyPress-A>
biểu thị một sự kiện nhấn phím A, và <Alt-Control-KeyPress-KP_Delete>
đại diện cho một sự kiện nhấn tổ hợp phím Alt + Ctrl + Delete.
Dưới đây là các bộ điều chỉnh, loại sự kiện và chi tiết sự kiện thường được sử dụng:
Bộ điều chỉnh sự kiện (Event Modifiers)
- Alt: Phím Alt được giữ
- Control: Phím Ctrl được giữ
- Shift: Phím Shift được giữ
- Any: Bộ điều chỉnh này làm cho loại sự kiện trở nên chung chung. Ví dụ, mẫu sự kiện
<Any-KeyPress>
áp dụng cho tất cả các sự kiện nhấn phím.
Loại sự kiện (Event Types)
- Activate: Trạng thái của widget thay đổi từ không hoạt động sang hoạt động.
- Button: Một nút chuột được nhấn
- ButtonRelease: Một nút chuột được thả
- Configure: Kích thước của widget thay đổi
- Deactivate: Trạng thái của widget thay đổi từ hoạt động sang không hoạt động.
- Destroy: Một widget đang bị phá hủy.
- Enter: Con trỏ chuột di chuyển vào phần hiển thị của widget.
- Expose: Một phần của widget hoặc ứng dụng trở nên hiển thị sau khi bị che bởi một cửa sổ khác.
- FocusIn: Tiêu điểm đầu vào được di chuyển vào một widget.
- FocusOut: Tiêu điểm đầu vào được di chuyển ra khỏi một widget.
- KeyPress: Một phím được nhấn.
- KeyRelease: Một phím được thả
- Leave: Con trỏ chuột di chuyển ra khỏi một widget.
- Map: Một widget được đặt trong một container (ví dụ: gọi phương thức
pack()
hoặcgrid()
). - Motion: Con trỏ chuột di chuyển hoàn toàn trong widget.
- MouseWheel: Người dùng di chuyển bánh xe chuột lên hoặc xuống.
- Unmap: Một widget bị gỡ bỏ và không còn hiển thị, ví dụ khi gọi phương thức
grid_remove()
trên widget. - Visibility: Ít nhất một phần của cửa sổ ứng dụng trở nên hiển thị trên màn hình.
Chi tiết sự kiện (Event Detail)
- .keysym: Tên ký tự của phím
- .keycode: Mã số của phím
- .keysym_num: Mã số đại diện cho tên ký tự của phím
Một số phím và mã đại diện:
Key | .keysym | .keycode | .keysym_num | Key |
---|---|---|---|---|
Alt_L | 64 | 65513 | Phím alt bên trái | |
Alt_R | 113 | 65514 | Phím alt bên phải | |
BackSpace | 22 | 65288 | Phím backspace | |
Cancel | 110 | 65387 | Phím hủy | |
Caps_Lock | 66 | 65549 | Phím CapsLock | |
Control_L | 37 | 65507 | Phím control bên trái | |
Control_R | 109 | 65508 | Phím control bên phải | |
Delete | 107 | 65535 | Phím Delete | |
Down | 104 | 65364 | Phím mũi tên xuống | |
End | 103 | 65367 | Phím end | |
Escape | 9 | 65307 | Phím esc | |
F1 | 67 | 65470 | Phím F1 | |
F2 | 68 | 65471 | Phím F2 | |
Home | 97 | 65360 | Phím home | |
Insert | 106 | 65379 | Phím insert | |
Left | 100 | 65361 | Phím mũi tên trái | |
Return | 36 | 65293 | Phím Enter | |
Right | 102 | 65363 | Phím mũi tên phải | |
Tab | 23 | 65289 | Phím tab |
Event Binding với cửa sổ root trong Python
Đến đây, bạn đã học cách Event Binding với một widget cụ thể. Tkinter cũng cho phép bạn Event Binding với cửa sổ cấp cao nhất (root).
Trong trường hợp này, cú pháp của phương thức bind()
giống nhau ngoại trừ việc bạn có thể gọi nó trên cửa sổ root như sau:
root.bind('<Return>', handler)
Các mức độ ràng buộc trong Python
Trong ví dụ trước, bạn đã học cách Event Binding với một instance cụ thể của widget. Đây được gọi là ràng buộc mức instance.
Tkinter cũng cho phép bạn Event Binding với tất cả các instance của một loại widget. Ví dụ, bạn có thể ràng buộc sự kiện với tất cả các hộp văn bản trong một chương trình:
root.bind_class('Entry', '<Control-V>', paste)
Đây được gọi là ràng buộc mức lớp, bởi vì bạn Event Binding với một lớp thay vì một instance cụ thể.
Gỡ Event Binding
Đôi khi, bạn có thể muốn hoàn tác tác dụng của một ràng buộc trước đó. Để làm điều này, bạn có thể sử dụng phương thức unbind()
:
widget.unbind(event)
Ví dụ sau gỡ Event Binding khỏi nút btn
:
btn.unbind('<Return>')
Kết bài
Phương thức bind()
trong Tkinter là một công cụ để ràng buộc các sự kiện với widget, giúp ứng dụng trở nên tương tác và linh hoạt hơn. Bằng cách sử dụng bind()
, bạn có thể dễ dàng xác định các hành động cụ thể sẽ được thực hiện khi xảy ra các sự kiện, chẳng hạn như nhấn phím hoặc nhấp chuột. Tkinter hỗ trợ cả ràng buộc ở mức instance (đối tượng cụ thể) và mức lớp (tất cả các đối tượng của một lớp widget), mang lại sự linh hoạt trong việc quản lý và xử lý các sự kiện. Với kiến thức về Event Binding , bạn có thể tạo ra các ứng dụng giao diện người dùng phong phú và đầy đủ chức năng.