ฉันสนับสนุนแนวทางเชิงวัตถุ นี่คือเทมเพลตที่ฉันเริ่มต้นด้วย:
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()
สิ่งสำคัญที่ควรสังเกตคือ:
ฉันไม่ใช้การนำเข้าสัญลักษณ์แทน ฉันนำเข้าแพ็คเกจเป็น "tk" ซึ่งต้องการให้ฉันนำหน้าคำสั่งทั้งหมดด้วยtk.
. สิ่งนี้จะป้องกันไม่ให้เกิดมลพิษเนมสเปซทั่วโลกรวมทั้งทำให้รหัสชัดเจนอย่างสมบูรณ์เมื่อคุณใช้คลาส Tkinter คลาส ttk หรือบางส่วนของคุณเอง
การประยุกต์ใช้หลักคือชั้นเรียน สิ่งนี้ช่วยให้คุณมีเนมสเปซส่วนตัวสำหรับการเรียกกลับและฟังก์ชันส่วนตัวทั้งหมดของคุณและโดยทั่วไปทำให้การจัดระเบียบโค้ดของคุณง่ายขึ้น ในรูปแบบขั้นตอนคุณต้องเขียนโค้ดจากบนลงล่างกำหนดฟังก์ชันก่อนใช้งาน ฯลฯ ด้วยวิธีนี้คุณจะไม่ทำเนื่องจากคุณไม่ได้สร้างหน้าต่างหลักจนกระทั่งถึงขั้นตอนสุดท้าย ฉันชอบที่จะสืบทอดจากtk.Frame
เพียงเพราะฉันมักจะเริ่มต้นด้วยการสร้างเฟรม แต่ก็ไม่จำเป็น
ถ้า app tk.Toplevel
ของคุณมีหน้าต่างระดับบนสุดเพิ่มเติมผมขอแนะนำให้ทำแต่ละคนแยกชั้นสืบทอดจาก สิ่งนี้ทำให้คุณได้เปรียบทั้งหมดที่กล่าวมาข้างต้น - หน้าต่างเป็นแบบปรมาณูมีเนมสเปซของตัวเองและโค้ดได้รับการจัดระเบียบอย่างดี นอกจากนี้ยังทำให้ง่ายต่อการใส่แต่ละโมดูลลงในโมดูลของตัวเองเมื่อโค้ดเริ่มมีขนาดใหญ่
สุดท้ายคุณอาจต้องการพิจารณาใช้คลาสสำหรับทุกส่วนหลักของอินเทอร์เฟซของคุณ ตัวอย่างเช่นหากคุณกำลังสร้างแอปที่มีแถบเครื่องมือบานหน้าต่างนำทางแถบสถานะและพื้นที่หลักคุณสามารถสร้างแต่ละคลาสเหล่านั้นได้ สิ่งนี้ทำให้โค้ดหลักของคุณค่อนข้างเล็กและเข้าใจง่าย:
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)
เนื่องจากอินสแตนซ์ทั้งหมดเหล่านั้นใช้พาเรนต์ร่วมกันพาเรนต์จึงกลายเป็นส่วน "คอนโทรลเลอร์" ของสถาปัตยกรรม model-view-controller ได้อย่างมีประสิทธิภาพ self.parent.statusbar.set("Hello, world")
ดังนั้นสำหรับตัวอย่างเช่นหน้าต่างหลักสามารถวางบางสิ่งบางอย่างเกี่ยวกับสถานะโดยการเรียก สิ่งนี้ช่วยให้คุณกำหนดอินเทอร์เฟซที่เรียบง่ายระหว่างส่วนประกอบช่วยให้การเชื่อมต่อกับ minimun