2015-09-30 6 views
5

ich verstehen will, was der folgende Code bedeutet:Verständnis Eltern und Controller in Tkinter __init__

class PageOne(tk.Frame): 

    def __init__(self, parent, controller): 

Was ist self, parent und controller? Was ist die Rolle und der Umfang dieser Werkzeuge hier?

Ich glaube, self ist vergleichbar mit this in Java, aber was ist die Verwendung von parent und controller?

später im Code fließen kann ich sehen:

button1 = tk.Button(self, text="Back to Home", 
     command=lambda: controller.show_frame(StartPage)) 

Es gibt eine Funktion bereits show_frame genannt definiert ist, aber warum ist die Steuerung verwendet werden, um diese Funktion zu nennen?

+0

Sie sind Parameter der Methode. Was verwirrt Sie an ihnen? Es gibt hier nichts Besonderes an "__init__", außer dass es automatisch mit den Parametern aufgerufen wird, die an den Instanziierungsaufruf übergeben wurden. –

+0

* "Ich glaube, dass self diesem in Java ähnlich ist" * - ja. * "Was ist die Verwendung von Eltern und Controller?" * - sie sind nur zwei weitere Initialisierungsparameter.In Tkinter übergeben Sie im Allgemeinen das "Eltern" -Widget, in dem sich das neue Widget befindet, an jedes neue Widget, um einen Baum für die gesamte Benutzeroberfläche zu definieren. "Controller" ist anscheinend etwas, das verwendet werden kann, um die gesamte Benutzeroberfläche zu steuern, anstatt ein Widget für globale Änderungen verantwortlich zu machen. – jonrsharpe

+0

Code scheint von http://stackoverflow.com/q/29444725/3001761 zu sein – jonrsharpe

Antwort

9

Grob gesagt, der ursprüngliche Code versucht, eine Pseudo-MVC (Modell, Ansicht und Controller) Architektur zu verwenden. Obwohl es keinen "Modell" -Teil gab, gab es nur eine "Ansicht" (einige Frames) und einen "Controller" (die Hauptanwendung). Daher der Verweis auf ein Controller-Objekt. Der ursprüngliche Code wurde tatsächlich geschrieben, um zu zeigen, wie Frames zu "stapeln" sind, daher ist die MVC-Implementierung sehr flach und zu wenig dokumentiert, da dies nicht der Sinn des Beispiels war.

Ihre spezifische Fragen zu beantworten:

Selbst das aktuelle Objekt darstellt. Dies ist ein allgemeiner erster Parameter für jede Methode einer Klasse. Wie Sie vorgeschlagen haben, ist es vergleichbar mit Javas dieser.

Das übergeordnete Element repräsentiert ein Widget, das als übergeordnetes Objekt des aktuellen Objekts fungiert. Alle Widgets in tkinter mit Ausnahme des Hauptfensters benötigen ein Elternelement.

Controller stellt ein anderes Objekt dar, das als gemeinsamer Interaktionspunkt für mehrere Widgets-Seiten fungieren soll. Es ist ein Versuch, die Seiten zu entkoppeln. Das heißt, jede Seite muss nicht über die anderen Seiten Bescheid wissen. Wenn es mit einer anderen Seite interagieren möchte, z. B. damit es sichtbar wird, kann es den Controller bitten, es sichtbar zu machen.

Sie haben gefragt "Es gibt eine bereits definierte Funktion namens show_frame, aber warum wird der Controller verwendet, um diese Funktion aufzurufen?" Beachten Sie, dass show_frame in einer separaten Klasse definiert ist, in diesem Fall die Hauptprogrammklasse. Es ist in den anderen Klassen nicht definiert. Damit die anderen Klassen sie aufrufen können, müssen sie sie auf einer Instanz der Hauptklasse aufrufen. Diese Instanz heißt controller im Kontext dieser anderen Klassen.


Hinweis: Auch wenn Sie wahrscheinlich den ursprünglichen Code in einem Online-Tutorial gefunden, es stammt ursprünglich aus dieser Antwort Stackoverflow: Switch between two frames in tkinter

+0

PERFEKT !! ich habe deine antwort hier immer wieder parallel mit code gelesen und jetzt macht es komplett sinn !! Der Code funktioniert, aber ich wollte nicht weitermachen, ohne zu verstehen, was hier vorgeht! Vielen Dank Bryan! –

+0

nur eine Frage, also was auch immer Klassen an der Hauptschleife eines tkinter Programms initialisiert werden, wirft einen "Kontroller" zur Klasse, die initialisiert wird ?? Das ist der Controller, der bei __INIT __ ??? gefangen und initialisiert wird. –

+0

@VasanthNagKV: "Werfen" ist eine seltsame Wortwahl. Aber ja, das Hauptprogramm wird als "Controller" -Parameter an jedes Objekt übergeben. –