Saya menganjurkan pendekatan berorientasi objek. Ini adalah template yang saya mulai dengan:
# 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()
Hal-hal penting yang perlu diperhatikan adalah:
Saya tidak menggunakan impor wildcard. Saya mengimpor paket sebagai "tk", yang mengharuskan saya mengawali semua perintah tk.
. Ini mencegah pencemaran namespace global, ditambah lagi membuat kode itu sangat jelas ketika Anda menggunakan kelas Tkinter, kelas ttk, atau sebagian dari Anda sendiri.
Aplikasi utama adalah kelas . Ini memberi Anda ruang nama pribadi untuk semua panggilan balik dan fungsi pribadi Anda, dan secara umum membuatnya lebih mudah untuk mengatur kode Anda. Dalam gaya prosedural Anda harus kode top-down, mendefinisikan fungsi sebelum menggunakannya, dll. Dengan metode ini Anda tidak melakukannya karena Anda tidak benar-benar membuat jendela utama sampai langkah terakhir. Saya lebih suka mewarisi dari tk.Frame
hanya karena saya biasanya mulai dengan membuat bingkai, tetapi itu sama sekali tidak perlu.
Jika aplikasi Anda memiliki jendela tingkat atas tambahan, saya sarankan untuk membuat masing-masing dari mereka menjadi kelas terpisah, diwarisi dari tk.Toplevel
. Ini memberi Anda semua keuntungan yang sama yang disebutkan di atas - jendela adalah atom, mereka memiliki ruang nama sendiri, dan kode terorganisir dengan baik. Plus, membuatnya mudah untuk menempatkan masing-masing ke dalam modulnya sendiri setelah kode mulai menjadi besar.
Terakhir, Anda mungkin ingin mempertimbangkan menggunakan kelas untuk setiap bagian utama antarmuka Anda. Misalnya, jika Anda membuat aplikasi dengan bilah alat, panel navigasi, bilah status, dan area utama, Anda dapat membuat masing-masing kelas tersebut. Ini membuat kode utama Anda cukup kecil dan mudah dimengerti:
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)
Karena semua instans tersebut memiliki induk yang sama, induk tersebut secara efektif menjadi bagian "pengontrol" dari arsitektur model-view-controller. Jadi, misalnya, jendela utama dapat meletakkan sesuatu di bilah status dengan memanggil self.parent.statusbar.set("Hello, world")
. Ini memungkinkan Anda untuk mendefinisikan antarmuka sederhana antara komponen, membantu menjaga kopling ke minimun.