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.

Trình quản lý hình học Grid trong Tkinter

Trong lập trình giao diện người dùng bằng Python, Tkinter là một thư viện phổ biến cho việc xây dựng các ứng dụng desktop. Một trong những công cụ quan trọng nhất của Tkinter là trình quản lý hình học Grid, cho phép bạn dễ dàng bố trí các thành phần giao diện như nút bấm, nhãn, ô nhập liệu theo cách thức có tổ chức và linh hoạt. Trong bài viết này, mình sẽ tìm hiểu cách sử dụng Grid để định vị các widget trên cửa sổ, từ đó tạo ra giao diện người dùng hiệu quả và đẹp mắt.

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ề trình quản lý hình học Grid trong Tkinter

Trình quản lý hình học Grid sử dụng các khái niệm về hàng và cột để sắp xếp các widget.

Dưới đây là ví dụ về một lưới có bốn hàng và ba cột:

Screenshot 202024 08 06 20002138 png

Mỗi hàng và cột trong lưới được xác định bởi một chỉ số. Theo mặc định, hàng đầu tiên có chỉ số là 0, hàng thứ hai là 1, và tiếp tục như vậy. Tương tự, các cột trong lưới có chỉ số là 0, 1, 2, v.v.

Bài viết này được đăng tại [free tuts .net]

Các chỉ số của hàng và cột trong lưới không nhất thiết phải bắt đầu từ 0. Hơn nữa, các chỉ số này có thể có khoảng trống.

Ví dụ, bạn có thể có một lưới với các chỉ số cột là 1, 2, 10, 11 và 12. Điều này hữu ích khi bạn có kế hoạch thêm nhiều widget vào giữa lưới sau này.

Giao điểm của một hàng và một cột được gọi là ô. Một ô là khu vực mà bạn có thể đặt một widget. Một ô chỉ có thể chứa một widget. Nếu bạn đặt hai widget vào cùng một ô, chúng sẽ chồng lên nhau.

Để đặt nhiều widget trong một ô, bạn có thể sử dụng Frame hoặc LabelFrame để bao quanh các widget và đặt Frame hoặc LabelFrame vào ô đó.

Chiều rộng của một cột phụ thuộc vào chiều rộng của widget mà nó chứa. Tương tự, chiều cao của một hàng phụ thuộc vào chiều cao của các widget chứa trong hàng đó.

Các hàng và cột có thể trải dài. Dưới đây là minh họa một lưới có ô (1,1) trải dài hai cột và ô (0,2) trải dài hai hàng:

Screenshot 202024 08 06 20002153 png

Cài đặt Grid trong Tkinter

Trước khi định vị các widget trên lưới, bạn cần cấu hình các hàng và cột của lưới.

Tkinter cung cấp cho bạn hai phương thức để cấu hình các hàng và cột của lưới:

container.columnconfigure(index, weight)
container.rowconfigure(index, weight)

Phương thức columnconfigure() dùng để cấu hình chỉ số cột của lưới.

Tham số weight xác định độ rộng của cột, so với các cột khác.

Ví dụ, một cột với weight là 2 sẽ rộng gấp đôi một cột với weight là 1.

Định vị Widget trên Grid trong Tkinter

Để đặt một widget trên lưới, bạn sử dụng phương thức grid() của widget đó:

widget.grid(**options)

Phương thức grid() có các tham số sau:

Tham số Ý nghĩa
column Chỉ số cột nơi bạn muốn đặt widget.
row Chỉ số hàng nơi bạn muốn đặt widget.
rowspan Đặt số lượng hàng liền kề mà widget có thể trải dài.
columnspan Đặt số lượng cột liền kề mà widget có thể trải dài.
sticky Nếu ô lớn hơn widget, tham số sticky chỉ định cạnh nào của ô mà widget sẽ dính vào và cách phân phối không gian thừa trong ô mà không bị chiếm bởi widget ở kích thước ban đầu.
padx Thêm khoảng đệm bên ngoài trên và dưới widget.
pady Thêm khoảng đệm bên ngoài bên trái và bên phải widget.
ipadx Thêm khoảng đệm bên trong widget từ bên trái và bên phải.
ipady Thêm khoảng đệm bên trong widget từ trên xuống dưới.

Sticky

Theo mặc định, khi một ô lớn hơn widget mà nó chứa, trình quản lý hình học Grid sẽ đặt widget ở trung tâm ô theo cả chiều ngang và dọc.

Để thay đổi hành vi mặc định này, bạn có thể sử dụng tùy chọn sticky. Tùy chọn sticky chỉ định cạnh nào của ô mà widget sẽ dính vào.

Giá trị của sticky có các giá trị hợp lệ sau:

Sticky Mô tả
N Bắc hoặc trung tâm phía trên
S Nam hoặc trung tâm phía dưới
E Đông hoặc trung tâm bên phải
W Tây hoặc trung tâm bên trái
NW Tây Bắc hoặc phía trên bên trái
NE Đông Bắc hoặc phía trên bên phải
SE Đông Nam hoặc phía dưới bên phải
SW Tây Nam hoặc phía dưới bên trái
NS NS kéo dài widget theo chiều dọc, để widget ở trung tâm theo chiều ngang.
EW EW kéo dài widget theo chiều ngang, để widget ở trung tâm theo chiều dọc.

Nếu bạn muốn đặt widget ở góc của ô, bạn có thể sử dụng N, S, E và W.

Dưới đây là ví dụ về cách định vị một widget với tùy chọn sticky được đặt là N:

Screenshot 202024 08 06 20002208 png

Nếu bạn muốn đặt widget ở trung tâm dọc theo một cạnh của ô, bạn có thể sử dụng NW (phía trên bên trái), NE (phía trên bên phải), SE (phía dưới bên phải) và SW (phía dưới bên trái).

Dưới đây là ví dụ về cách định vị một widget với tùy chọn sticky được đặt là NW:

Screenshot 202024 08 06 20002221 png

NS kéo dài widget theo chiều dọc, nhưng để widget ở trung tâm theo chiều ngang:

Screenshot 202024 08 06 20002234 png

EW kéo dài widget theo chiều ngang, nhưng để widget ở trung tâm theo chiều dọc:

Screenshot 202024 08 06 20002247 png

Padding trong Tkinter

Để thêm khoảng đệm giữa các ô của lưới, bạn sử dụng các tùy chọn padxpady. Các tùy chọn padxpady là khoảng đệm bên ngoài:

grid(column, row, sticky, padx, pady)

Để thêm khoảng đệm bên trong chính widget, bạn sử dụng các tùy chọn ipadxipady. Các tùy chọn ipadxipady là khoảng đệm bên trong:

grid(column, row, sticky, padx, pady, ipadx, ipady)

Các khoảng đệm bên trong và bên ngoài mặc định là không có.

Ví dụ về trình quản lý hình học Grid trong Tkinter

Trong ví dụ này, chúng ta sẽ sử dụng trình quản lý hình học Grid để thiết kế một màn hình đăng nhập như sau:

Tkinter Grid Example png

Màn hình đăng nhập sử dụng một lưới có hai cột và ba hàng. Ngoài ra, cột thứ hai rộng gấp ba lần cột đầu tiên:

Tkinter Grid row and column configruation png

Dưới đây là mã nguồn hoàn chỉnh cho cửa sổ đăng nhập:

import tkinter as tk
from tkinter import ttk

# Tạo cửa sổ gốc
root = tk.Tk()
root.geometry("240x100")
root.title('Login')
root.resizable(0, 0)

# Cấu hình lưới
root.columnconfigure(0, weight=1)
root.columnconfigure(1, weight=3)

# Nhãn Username
username_label = ttk.Label(root, text="Username:")
username_label.grid(column=0, row=0, sticky=tk.W, padx=5, pady=5)

username_entry = ttk.Entry(root)
username_entry.grid(column=1, row=0, sticky=tk.E, padx=5, pady=5)

# Nhãn Password
password_label = ttk.Label(root, text="Password:")
password_label.grid(column=0, row=1, sticky=tk.W, padx=5, pady=5)

password_entry = ttk.Entry(root, show="*")
password_entry.grid(column=1, row=1, sticky=tk.E, padx=5, pady=5)

# Nút Login
login_button = ttk.Button(root, text="Login")
login_button.grid(column=1, row=3, sticky=tk.E, padx=5, pady=5)

root.mainloop()

Cách hoạt động

Đầu tiên, sử dụng phương thức columnconfigure() để đặt trọng số cho cột đầu tiên và cột thứ hai của lưới. Chiều rộng của cột thứ hai lớn gấp ba lần chiều rộng của cột đầu tiên.

root.columnconfigure(0, weight=1)
root.columnconfigure(1, weight=3)

Thứ hai, định vị nhãn username trên cột đầu tiên và mục nhập username trên cột thứ hai của hàng đầu tiên của lưới:

username_label = ttk.Label(root, text="Username:")
username_label.grid(column=0, row=0, sticky=tk.W, padx=5, pady=5)

username_entry = ttk.Entry(root)
username_entry.grid(column=1, row=0, sticky=tk.E, padx=5, pady=5)

Thứ ba, định vị nhãn password và mục nhập password trên cột đầu tiên và cột thứ hai của hàng thứ hai:

password_label = ttk.Label(root, text="Password:")
password_label.grid(column=0, row=1, sticky=tk.W, padx=5, pady=5)

password_entry = ttk.Entry(root, show="*")
password_entry.grid(column=1, row=1, sticky=tk.E, padx=5, pady=5)

Cuối cùng, định vị nút login trên hàng thứ ba. Vì tùy chọn sticky được đặt là E, nút sẽ được căn về bên phải của hàng thứ ba.

login_button = ttk.Button(root, text="Login")
login_button.grid(column=1, row=3, sticky=tk.E, padx=5, pady=5)

Dưới đây là cùng một chương trình nhưng được viết theo hướng đối tượng:

import tkinter as tk
from tkinter import ttk

class App(tk.Tk):
    def __init__(self):
        super().__init__()

        self.geometry("240x100")
        self.title('Login')
        self.resizable(0, 0)

        # Cấu hình lưới
        self.columnconfigure(0, weight=1)
        self.columnconfigure(1, weight=3)

        self.create_widgets()

    def create_widgets(self):
        # Nhãn Username
        username_label = ttk.Label(self, text="Username:")
        username_label.grid(column=0, row=0, sticky=tk.W, padx=5, pady=5)

        username_entry = ttk.Entry(self)
        username_entry.grid(column=1, row=0, sticky=tk.E, padx=5, pady=5)

        # Nhãn Password
        password_label = ttk.Label(self, text="Password:")
        password_label.grid(column=0, row=1, sticky=tk.W, padx=5, pady=5)

        password_entry = ttk.Entry(self, show="*")
        password_entry.grid(column=1, row=1, sticky=tk.E, padx=5, pady=5)

        # Nút Login
        login_button = ttk.Button(self, text="Login")
        login_button.grid(column=1, row=3, sticky=tk.E, padx=5, pady=5)

if __name__ == "__main__":
    app = App()
    app.mainloop()

Kết bài

Như vậy, việc sử dụng các phương thức columnconfigure()rowconfigure() giúp bạn thiết lập trọng số cho các cột và hàng trong lưới, cho phép điều chỉnh kích thước và bố cục của các widget một cách linh hoạt. Phương thức grid() là công cụ mạnh mẽ để định vị các widget trên lưới, giúp bạn dễ dàng quản lý và sắp xếp giao diện người dùng. Tùy chọn sticky cung cấp khả năng căn chỉnh vị trí của widget trong ô và kiểm soát cách chúng được kéo dài, tạo điều kiện thuận lợi cho việc tối ưu hóa giao diện. Cuối cùng, việc sử dụng các tham số ipadx, ipady, padx, và pady để thêm khoảng đệm bên trong và bên ngoài các widget giúp nâng cao trải nghiệm người dùng bằng cách tạo ra sự gọn gàng và hợp lý trong bố cục.

Với những kiến thức và kỹ năng này, bạn sẽ có thể tạo ra các ứng dụng với giao diện trực quan, dễ sử dụng và chuyên nghiệp. Tkinter không chỉ đơn thuần là một công cụ lập trình giao diện mà còn là một phần quan trọng trong việc xây dựng trải nghiệm người dùng tốt hơn. Hy vọng rằng bài viết này đã giúp bạn hiểu rõ hơn về cách sử dụng trình quản lý hình học Grid trong Tkinter và có thể áp dụng vào các dự án của mình.

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