Tôi ủng hộ một cách tiếp cận hướng đối tượng. Đây là mẫu mà tôi bắt đầu với:
# Use Tkinter for python 2, tkinter for python 3
import tkinter as tk
class MainApplication(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
self.parent = parent
<create the rest of your GUI here>
if __name__ == "__main__":
root = tk.Tk()
MainApplication(root).pack(side="top", fill="both", expand=True)
root.mainloop()
Những điều quan trọng cần chú ý là:
Tôi không sử dụng nhập ký tự đại diện. Tôi nhập gói dưới dạng "tk", yêu cầu tôi phải thêm tiền tố vào tất cả các lệnh tk.
. Điều này ngăn ngừa ô nhiễm không gian tên toàn cầu, cộng với nó làm cho mã hoàn toàn rõ ràng khi bạn đang sử dụng các lớp Tkinter, các lớp ttk hoặc một số của riêng bạn.
Ứng dụng chính là một lớp học . Điều này cung cấp cho bạn một không gian tên riêng cho tất cả các cuộc gọi lại và các chức năng riêng tư của bạn và nói chung chỉ giúp việc tổ chức mã của bạn dễ dàng hơn. Trong một kiểu thủ tục, bạn phải viết mã từ trên xuống, xác định các hàm trước khi sử dụng chúng, v.v. Với phương pháp này, bạn không thực sự tạo ra cửa sổ chính cho đến bước cuối cùng. Tôi thích kế thừa từ tk.Frame
chỉ vì tôi thường bắt đầu bằng cách tạo khung, nhưng nó không có nghĩa là cần thiết.
Nếu ứng dụng của bạn có thêm các cửa sổ toplevel, tôi khuyên bạn nên tạo cho mỗi lớp một lớp riêng biệt, kế thừa từ đó tk.Toplevel
. Điều này cung cấp cho bạn tất cả các lợi thế tương tự được đề cập ở trên - các cửa sổ là nguyên tử, chúng có không gian tên riêng và mã được tổ chức tốt. Thêm vào đó, nó giúp bạn dễ dàng đặt từng cái vào mô-đun của riêng mình một khi mã bắt đầu lớn.
Cuối cùng, bạn có thể muốn xem xét sử dụng các lớp cho mọi phần chính của giao diện của bạn. Ví dụ: nếu bạn đang tạo một ứng dụng bằng thanh công cụ, ngăn điều hướng, thanh trạng thái và khu vực chính, bạn có thể tạo từng ứng dụng trong số các lớp đó. Điều này làm cho mã chính của bạn khá nhỏ và dễ hiểu:
class Navbar(tk.Frame): ...
class Toolbar(tk.Frame): ...
class Statusbar(tk.Frame): ...
class Main(tk.Frame): ...
class MainApplication(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
self.statusbar = Statusbar(self, ...)
self.toolbar = Toolbar(self, ...)
self.navbar = Navbar(self, ...)
self.main = Main(self, ...)
self.statusbar.pack(side="bottom", fill="x")
self.toolbar.pack(side="top", fill="x")
self.navbar.pack(side="left", fill="y")
self.main.pack(side="right", fill="both", expand=True)
Vì tất cả các trường hợp đó có chung một cha mẹ, nên cha mẹ thực sự trở thành một phần "bộ điều khiển" của kiến trúc mô hình-khung nhìn-bộ điều khiển. Vì vậy, ví dụ, cửa sổ chính có thể đặt một cái gì đó trên thanh trạng thái bằng cách gọi self.parent.statusbar.set("Hello, world")
. Điều này cho phép bạn xác định một giao diện đơn giản giữa các thành phần, giúp duy trì khớp nối đến mức tối thiểu.