Nesneye yönelik bir yaklaşımı savunuyorum. Bu ile başladığım şablon:
# 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()
Dikkat edilmesi gereken önemli noktalar:
Joker karakter içe aktarımı kullanmıyorum. Paketi tüm komutların önekini gerektiren "tk" olarak alıyorum tk.
. Bu, global ad alanı kirliliğini önler, ayrıca Tkinter sınıflarını, ttk sınıflarını veya kendi sınıflarınızı kullanırken kodu tamamen açık hale getirir.
Ana uygulama bir sınıftır . Bu, tüm geri aramalarınız ve özel işlevleriniz için özel bir ad alanı sağlar ve genellikle kodunuzu düzenlemenizi kolaylaştırır. Yordamsal bir tarzda, yukarıdan aşağıya kod yazmanız, işlevleri kullanmadan önce tanımlamanız gerekir. tk.Frame
Sadece bir çerçeve oluşturarak başladığım için miras almayı tercih ederim , ancak hiçbir şekilde gerekli değildir.
Uygulamanızın ek üst düzey pencereleri varsa, bunların her birini ayrı bir sınıf haline getirmenizi ve devralınmasını öneririz tk.Toplevel
. Bu size yukarıda belirtilen avantajların tümünü verir - pencereler atomik, kendi ad alanlarına sahiptir ve kod iyi organize edilmiştir. Ayrıca, kod büyüdükçe her birini kendi modülüne koymayı kolaylaştırır.
Son olarak, arayüzünüzün her büyük bölümü için sınıf kullanmayı düşünebilirsiniz. Örneğin, bir araç çubuğu, bir gezinme bölmesi, bir durum çubuğu ve bir ana alan içeren bir uygulama oluşturuyorsanız, bu sınıfların her birini yapabilirsiniz. Bu, ana kodunuzu oldukça küçük ve kolay anlaşılır hale getirir:
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)
Bu örneklerin tümü ortak bir üst öğeyi paylaştığından, üst öğe etkili bir şekilde bir model görünümü denetleyici mimarisinin "denetleyici" bölümü haline gelir. Örneğin, ana pencere durum çubuğuna arayarak bir şey yerleştirebilir self.parent.statusbar.set("Hello, world")
. Bu, bileşenler arasında basit bir arabirim tanımlamanızı sağlar ve bir minimun ile bağlantıyı sürdürmeye yardımcı olur.