Der beste Weg, eine TKinter-Anwendung zu strukturieren
Folgenden ist die Allgemeine Struktur meiner typischen python-tkinter-Programm.
def funA():
def funA1():
def funA12():
# stuff
def funA2():
# stuff
def funB():
def funB1():
# stuff
def funB2():
# stuff
def funC():
def funC1():
# stuff
def funC2():
# stuff
root = tk.Tk()
button1 = tk.Button(root, command=funA)
button1.pack()
button2 = tk.Button(root, command=funB)
button2.pack()
button3 = tk.Button(root, command=funC)
button3.pack()
funA
funB
und funC
wird ein weiterer Toplevel
windows mit widgets, wenn Benutzer klicken Sie auf die Schaltfläche 1, 2, 3.
Frage ich mich, ob dies die richtige Art und Weise zu schreiben, ein python-tkinter-Programm? Sicher, es wird funktionieren, auch wenn ich Schreibe, auf diese Weise, aber es ist der beste Weg? Es klingt dumm, aber wenn ich die codes von anderen Leuten geschrieben, deren code nicht Durcheinander mit Bündel von Funktionen und vor allem Sie haben Klassen.
Gibt es eine bestimmte Struktur, die wir befolgen sollten als gute Praxis? Wie soll ich planen, bevor Sie beginnen, schreiben Sie ein python-Programm?
Ich weiß, es gibt keine solche Sache als beste Praxis in der Programmierung und ich bin nicht danach gefragt. Ich will nur einige Hinweise und Erklärungen, um mich auf die richtige Richtung, wie ich Lerne Python selbst.
InformationsquelleAutor der Frage Chris Aung | 2013-07-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich mich für einen objektorientierten Ansatz. Dies ist die Vorlage, die ich beginnen mit:
Wichtige Dinge zu beachten:
Ich glaube nicht, verwenden Sie einen Platzhalter importieren. Ich Importiere das Paket als "tk", die erfordert, dass ich die Präfix-alle Befehle mit
tk.
. Dies verhindert, dass Globale namespace-Verschmutzung, plus es macht den code völlig offensichtlich, wenn Sie mit Tkinter-Klassen, ttk Klassen, oder einige Ihrer eigenen.Das Hauptprogramm ist eine Klasse. Dies gibt Ihnen einen private namespace für alle Ihre Rückrufe und privaten Funktionen, und nur in der Regel macht es einfacher zu organisieren Sie Ihren code. In einer prozeduralen Stil, den Sie haben, um code top-down-Definition von Funktionen, bevor Sie Sie verwenden, etc. Mit dieser Methode werden Sie nicht, da Sie nicht wirklich erstellen, das Hauptfenster, bis der allerletzte Schritt. Ich bevorzuge Erben von
tk.Frame
nur weil ich in der Regel beginnen, indem Sie einen Rahmen zu erstellen, aber es ist keineswegs notwendig.Wenn Ihre app hat zusätzliche toplevel-windows, ich empfehle, jede von denen eine eigene Klasse erbt von
tk.Toplevel
. Dies gibt Ihnen die gleichen Vorteile, die oben erwähnt -- die Fenster sind atomar, Sie haben Ihren eigenen Namensraum, und der code ist gut organisiert. Plus, es macht es einfach, jedes in ein eigenes Modul, sobald der code beginnt zu groß werden.Schließlich, möchten Sie vielleicht zu prüfen, mit Klassen für alle großen Teil Ihrer Oberfläche. Zum Beispiel, wenn Sie erstellen eine app mit einer Symbolleiste einem Navigationsbereich, eine Statusleiste und ein main-Gebiet, Sie könnten machen, das jeder dieser Klassen. Dies macht den Hauptteil Ihres Codes ganz klein und leicht zu verstehen:
Da alle diese Instanzen, die eine gemeinsame Muttergesellschaft, die Muttergesellschaft effektiv wird der "controller" - Teil des model-view-controller-Architektur. So, zum Beispiel, wird das Hauptfenster könnte etwas auf die statusbar durch den Aufruf
self.parent.statusbar.set("Hello, world")
. Dies ermöglicht es Ihnen zu definieren, die eine einfache Schnittstelle zwischen den Komponenten, die helfen, halten Sie die Kupplung auf ein minimun.InformationsquelleAutor der Antwort Bryan Oakley
Setzen jeden Ihrer top-level-windows in Ihren eigenen separaten Klasse gibt Sie code re-use und bessere code-Organisation. Alle Tasten und relevante Methoden, die vorhanden sind, sollte das Fenster definiert werden, die innerhalb dieser Klasse. Hier ein Beispiel (entnommen aus hier):
Siehe auch:
Hoffe, das hilft.
InformationsquelleAutor der Antwort alecxe
Hier ist ein Super tutorial auf tkinter GUI-design, mit ein paar Beispiele -- http://python-textbok.readthedocs.org/en/latest/Introduction_to_GUI_Programming.html
Hier ist ein weiteres Beispiel mit einem MVC-design-pattern -- https://sukhbinder.wordpress.com/2014/12/25/an-example-of-model-view-controller-design-pattern-with-tkinter-python/
InformationsquelleAutor der Antwort NargothBond
Dies ist nicht eine schlechte Struktur; es wird gut funktionieren. Aber, müssen Sie haben Funktionen in einer Funktion zu tun Befehle, wenn jemand Klicks auf eine Schaltfläche oder etwas
Also, was Sie tun können, schreiben Sie Klassen für diese haben dann die Methoden in der Klasse, Griff-Befehle für die button-Klicks und so.
Hier ein Beispiel:
In der Regel tk-Programme mit mehreren Fenstern sind mehrere große Klassen und in der
__init__
alle Einträge, Etiketten etc sind erstellt und dann wird jede Methode zu behandeln button-click-eventsGibt es nicht wirklich eine richtige Weg, es zu tun, was für Sie arbeitet und bekommt den job getan, solange es lesbar und man kann leicht erklären, weil, wenn Sie Sie nicht einfach erklären, Ihr Programm, gibt es wahrscheinlich einen besseren Weg, es zu tun.
Werfen Sie einen Blick auf Das denken in Tkinter.
InformationsquelleAutor der Antwort Serial
Wahrscheinlich der beste Weg, um zu lernen, wie strukturieren Sie Ihr Programm durch das Lesen anderer Leute code, vor allem wenn es ein großes Programm, zu dem viele Menschen beigetragen haben. Nach einem Blick auf den code, der von vielen Vorhaben, sollten Sie eine Vorstellung davon bekommen, was die Konsens-Stil sein sollte.
Python als Sprache, ist besonders, es gibt einige starke Leitlinien, wie Sie sollten, formatieren Sie den code. Die erste ist die so genannt "Zen of Python":
Auf einer mehr praktischen Ebene, es ist PEP8der style guide für Python.
Mit diesen Gedanken, ich würde sagen, dass Ihr code Stil passt nicht wirklich, besonders die verschachtelten Funktionen. Einen Weg finden, Sie zu glätten heraus, entweder durch die Verwendung von Klassen oder verschieben Sie Sie in separate Module. Dadurch wird die Struktur des Programms viel einfacher zu verstehen.
InformationsquelleAutor der Antwort
OOP sollte der Ansatz und die
frame
sollte ein Klasse variable statt Instanz-variable.Referenz: http://www.python-course.eu/tkinter_buttons.php
InformationsquelleAutor der Antwort Nik
Ich persönlich nicht verwenden der beanstandeten orientierten Ansatz, vor allem, weil es a) nur in die Quere kommen; b) Sie werden nie Wiederverwendung, die als Modul.
aber sowas wird hier nicht diskutiert, ist, dass Sie muss Verwendung threading oder multiprocessing. Immer. Ihr Antrag wird sonst furchtbar sein.
nur ein einfacher test: öffnen Sie ein Fenster, und dann Holen einige URL oder irgendwas anderes. änderungen wird die Benutzeroberfläche nicht aktualisiert werden, während die Netzwerk-Anfrage geschieht. Bedeutung, Ihre Anwendung Fenster gebrochen werden. hängt das Betriebssystem Sie auf, aber die meisten Zeiten, es wird nicht neu gezeichnet, alles, was Sie ziehen Sie über das Fenster verputzt werden auf es, bis der Prozess wieder auf die TK mainloop.
InformationsquelleAutor der Antwort gcb