Ich befürworte einen objektorientierten Ansatz. Dies ist die Vorlage, mit der ich beginne:
# 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()
Die wichtigsten Dinge zu beachten sind:
Ich verwende keinen Platzhalterimport. Ich importiere das Paket als "tk", was erfordert, dass ich allen Befehlen ein Präfix vorstelle tk.
. Dies verhindert eine globale Verschmutzung des Namespace und macht den Code vollständig offensichtlich, wenn Sie Tkinter-Klassen, ttk-Klassen oder einige Ihrer eigenen verwenden.
Die Hauptanwendung ist eine Klasse . Dies gibt Ihnen einen privaten Namespace für alle Ihre Rückrufe und privaten Funktionen und erleichtert im Allgemeinen die Organisation Ihres Codes. In einem prozeduralen Stil müssen Sie von oben nach unten codieren, Funktionen definieren, bevor Sie sie verwenden usw. Mit dieser Methode tun Sie dies nicht, da Sie das Hauptfenster erst im letzten Schritt erstellen. Ich bevorzuge es zu erben, tk.Frame
nur weil ich normalerweise mit dem Erstellen eines Rahmens beginne, aber es ist keineswegs notwendig.
Wenn Ihre App über zusätzliche Fenster auf oberster Ebene verfügt, empfehle ich, jede dieser Fenster zu einer separaten Klasse zu machen, von der geerbt wird tk.Toplevel
. Dies bietet Ihnen alle oben genannten Vorteile: Die Fenster sind atomar, sie haben einen eigenen Namespace und der Code ist gut organisiert. Außerdem ist es einfach, jedes Modul in ein eigenes Modul zu integrieren, sobald der Code groß wird.
Schließlich möchten Sie möglicherweise Klassen für jeden Hauptteil Ihrer Benutzeroberfläche verwenden. Wenn Sie beispielsweise eine App mit einer Symbolleiste, einem Navigationsbereich, einer Statusleiste und einem Hauptbereich erstellen, können Sie jede dieser Klassen erstellen. Dies macht Ihren Hauptcode ziemlich klein und leicht verständlich:
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)
Da alle diese Instanzen ein gemeinsames übergeordnetes Element haben, wird das übergeordnete Element effektiv zum "Controller" -Teil einer Model-View-Controller-Architektur. So könnte beispielsweise das Hauptfenster durch Aufrufen etwas in der Statusleiste platzieren self.parent.statusbar.set("Hello, world")
. Auf diese Weise können Sie eine einfache Schnittstelle zwischen den Komponenten definieren und so die Kopplung auf ein Minimum beschränken.