CodeGym /Khóa học Java /Python SELF VI /Cơ bản về bố cục giao diện (grid, pack)

Cơ bản về bố cục giao diện (grid, pack)

Python SELF VI
Mức độ , Bài học
Có sẵn

1. Phương pháp bố trí các thành phần trong Tkinter

Như bạn có thể đã để ý, giao diện đồ họa không chỉ là các nút và trường văn bản bày lung tung trên màn hình. Chúng là những ứng dụng được cấu trúc tốt và thân thiện, nơi từng chi tiết đều nằm đúng chỗ. Tkinter cung cấp ba phương pháp bố trí chính: pack, gridplace. Hôm nay chúng ta sẽ tập trung vào packgrid, để place lại cho các trường hợp phức tạp hơn khi cần đặt các thành phần ở vị trí tuyệt đối.

Tìm hiểu về pack

Phương pháp pack là một cách đơn giản và trực quan để sắp xếp các widget. Nó bố trí các thành phần theo nguyên tắc "đến trước, phục vụ trước" và cho phép tổ chức giao diện một cách nhanh chóng và dễ dàng. Tuy nhiên, vì sự đơn giản của nó, pack không luôn cung cấp đầy đủ quyền kiểm soát về vị trí chính xác của các thành phần.

Ví dụ sử dụng pack


import tkinter as tk

root = tk.Tk()
root.title("Ví dụ bố cục với pack")

# Tạo một vài widget
label = tk.Label(root, text="Tôi là nhãn")
button = tk.Button(root, text="Tôi là nút")

# Đặt các widget bằng pack
label.pack()
button.pack()

root.mainloop()

Trong ví dụ này, labelbutton được đặt lần lượt bên dưới nhau, giống như một hàng người xếp hàng mua cà phê. Có vẻ bạn nhân viên Starbucks đã quen với điều này rồi!

Tìm hiểu về grid

Nếu như pack là một lễ hội sôi động và hỗn loạn, thì grid là một thư viện cổ điển, nơi mỗi cuốn sách (hay widget) đều có chỗ đứng riêng trên kệ. Phương pháp grid cho phép bố trí các thành phần dưới dạng bảng, cung cấp khả năng kiểm soát chính xác vị trí. Lúc này, bạn có thể tự quyết định widget nào ở bên cạnh widget nào.

Ví dụ sử dụng grid


import tkinter as tk

root = tk.Tk()
root.title("Ví dụ bố cục với grid")

# Tạo các nút
buttons = [
    "1", "2", "3",
    "4", "5", "6",
    "7", "8", "9",
    "0", "+", "="
]

# Đặt các nút vào trong lưới
row_val = 0
col_val = 0

for button in buttons:
    btn = tk.Button(root, text=button, width=5)
    btn.grid(row=row_val, column=col_val)
    col_val += 1
    if col_val > 2:
        col_val = 0
        row_val += 1

root.mainloop()

Trong ví dụ này, các nút grid xếp thành hàng, giống như một buổi điểm danh buổi sáng, gọn gàng và chuyên nghiệp hơn rất nhiều.

2. Sử dụng pack để đặt bố cục

Phương pháp pack có vài chế độ khác nhau, cho phép kiểm soát cách các thành phần được sắp xếp liên quan đến nhau. Nó hỗ trợ các tham số như side, fill, expandpadx/pady.

Cấu hình pack

  • side: Xác định từ phía nào của container cha mà thành phần sẽ được đặt. Các giá trị có thể là TOP, BOTTOM, LEFT, hoặc RIGHT.
  • fill: Quyết định liệu thành phần sẽ lấp đầy không gian trống theo hướng nào. Ví dụ, X lấp đầy theo chiều ngang, còn Y thì theo chiều dọc.
  • expand: Cho biết liệu thành phần có nên chiếm thêm không gian khi có sẵn hay không.
  • padx/pady: Đặt khoảng cách padding theo chiều ngang và dọc.

Ví dụ nâng cao về pack


import tkinter as tk

root = tk.Tk()
root.title("Ví dụ mở rộng pack")

tk.Label(root, text="Trên cùng").pack(side=tk.TOP, fill=tk.X)
tk.Label(root, text="Dưới cùng").pack(side=tk.BOTTOM, fill=tk.X)
tk.Label(root, text="Bên trái").pack(side=tk.LEFT, fill=tk.Y)
tk.Label(root, text="Bên phải").pack(side=tk.RIGHT, fill=tk.Y)

root.mainloop()

3. Sử dụng grid để bố trí dạng lưới

Phương pháp grid phức tạp hơn và yêu cầu bạn hiểu cách hoạt động của lưới và các ô. Nhưng một khi đã thành thạo, bạn có thể tạo ra các giao diện phức tạp nhất.

Cấu hình grid

  • row / column: Xác định hàng hoặc cột mà thành phần sẽ được đặt.
  • rowspan / columnspan: Xác định số hàng hoặc cột mà thành phần sẽ chiếm.
  • sticky: Xác định cách thành phần "dính" vào biên của ô. Tham số có thể là N, E, S, W hoặc kết hợp của chúng.

Ví dụ nâng cao về grid


import tkinter as tk

root = tk.Tk()
root.title("Ví dụ mở rộng grid")

# Tạo nhãn và đặt chúng vào lưới
tk.Label(root, text="Hàng 0, Cột 0").grid(row=0, column=0, sticky="W")
tk.Label(root, text="Hàng 0, Cột 1").grid(row=0, column=1, sticky="E")
tk.Label(root, text="Hàng 1, Cột 0").grid(row=1, column=0, columnspan=2)

root.mainloop()

4. Ứng dụng thực tế và lỗi thường gặp

Có thể bạn sẽ muốn sử dụng chỉ một phương pháp bố trí, nhưng trên thực tế thường cần phải kết hợp chúng. Lỗi thường gặp bao gồm: quên gọi mainloop, chỉ định sai chỉ số hàng hoặc cột, không sử dụng expandfill khi cần thiết. Để tránh đau đầu khi làm giao diện, luôn kiểm tra thứ tự gọi pack hoặc grid và đảm bảo sử dụng đúng các tham số của chúng.

Sự khác biệt giữa packgrid nằm ở tính linh hoạt và khả năng kiểm soát vị trí thành phần. pack tiện lợi cho giao diện đơn giản theo chiều dọc hoặc ngang, trong khi grid phù hợp cho bố cục phức tạp, nơi yêu cầu vị trí chính xác của các thành phần.

Giờ khi bạn đã sẵn sàng phát triển giao diện của riêng mình với các phương pháp bố trí, hãy nhớ rằng việc sắp xếp các widget trên màn hình giống như tổ chức một bữa tiệc, nơi mọi người đều cần cảm thấy thoải mái. Có người thích ở sát tường, có người lại thích ở giữa phòng, nhưng ai cũng cần cảm thấy thư giãn. Hãy bắt tay vào công việc và tạo nên những giao diện tuyệt vời!

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION