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.

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.

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ề 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_pressedlog.

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ặc grid()).
  • 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.

Cùng chuyên mục:

Hướng dẫn xây dựng Command-Line Interface (CLI) bằng Quo trong Python

Hướng dẫn xây dựng Command-Line Interface (CLI) bằng Quo trong Python

Hướng dẫn toàn diện về module datetime trong Python

Hướng dẫn toàn diện về module datetime trong Python

Cách truy cập và thiết lập biến môi trường trong Python

Cách truy cập và thiết lập biến môi trường trong Python

Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass

Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass

Từ khóa yield trong Python

Từ khóa yield trong Python

Sự khác biệt giữa sort() và sorted() trong Python

Sự khác biệt giữa sort() và sorted() trong Python

Sử dụng Poetry để quản lý dependencies trong Python

Sử dụng Poetry để quản lý dependencies trong Python

Định dạng chuỗi Strings trong Python

Định dạng chuỗi Strings trong Python

Một tác vụ phổ biến khi làm việc với danh sách trong Python

Một tác vụ phổ biến khi làm việc với danh sách trong Python

Làm việc với các biến môi trường trong Python

Làm việc với các biến môi trường trong Python

Sự khác biệt giữa set() và frozenset() trong Python

Sự khác biệt giữa set() và frozenset() trong Python

Sự khác biệt giữa iterator và iterable trong Python

Sự khác biệt giữa iterator và iterable trong Python

Cách làm việc với file tarball/tar trong Python

Cách làm việc với file tarball/tar trong Python

Chuyển đổi kiểu dữ liệu trong Python

Chuyển đổi kiểu dữ liệu trong Python

Sự khác biệt giữa toán tử == và is trong Python

Sự khác biệt giữa toán tử == và is trong Python

Làm việc với file ZIP trong Python

Làm việc với file ZIP trong Python

Cách sử dụng ThreadPoolExecutor trong Python

Cách sử dụng ThreadPoolExecutor trong Python

Sự khác biệt giữa byte objects và string trong Python

Sự khác biệt giữa byte objects và string trong Python

Xử lý độ chính xác các hàm floor, ceil, round, trunc, format  trong Python

Xử lý độ chính xác các hàm floor, ceil, round, trunc, format trong Python

Cách lặp qua nhiều list với hàm zip() trong Python

Cách lặp qua nhiều list với hàm zip() trong Python

Top