[PYTHON] MVC mit Tkinter

Einführung

MVC (Model-View-Controller) in diesem Artikel bezieht sich auf das Trennen von Funktionen gemäß der folgenden Richtlinie. ** Modell **: Ich kenne View oder Controller nicht. Führen Sie die Berechnung einfach durch. ** Ansicht **: Ich kenne weder Modell noch Controller. Nur im Streben nach Schönheit. ** Controller **: Eine göttliche Position, die sowohl Modell als auch Ansicht kennt. Es verbindet Modell und Ansicht.

Ich weiß nicht, wie die Nummer lautet, Überraschenderweise dachte ich, dass es nicht viele Informationen zu MVC gibt, die der oben genannten Richtlinie entsprechen, daher werde ich sie als Artikel schreiben.

Plötzlich Code

import tkinter as tk


class Model:
    def __init__(self):
        self.val = tk.IntVar(0)

    def add_one(self):
        self.val.set(self.val.get() + 1)

    def reset(self):
        self.val.set(0)


class View(tk.Frame):
    def __init__(self, parent):
        super().__init__(parent)
        self.parent = parent
        self.value_label = tk.Label(self)
        self.add_one_btn = tk.Button(self, text="ADD ONE")
        self.reset_btn = tk.Button(self, text="RESET")
        
        self.value_label.pack()
        self.add_one_btn.pack()
        self.reset_btn.pack()
        self.pack()


class Controller:
    def __init__(self, root):
        self.model = Model()
        self.view = View(root)

        # Binding
        self.view.value_label.config(textvariable=self.model.val)

        # Callback
        self.view.add_one_btn.config(command=self.model.add_one)
        self.view.reset_btn.config(command=self.model.reset)


if __name__ == "__main__":
    root = tk.Tk()
    app = Controller(root)
    root.mainloop()

Fertiges Produkt

スクリーンショット 2020-08-29 16.25.14.png

Wenn Sie die Taste ADD ONE drücken, erhöht sich die obige Zahl um eins. Drücken Sie die RESET-Taste, um die obige Zahl auf 0 zurückzusetzen.

Kommentar

Was ist los?

Model tk.IntVar () ist sehr praktisch. Ich benutze dies anstelle des üblichen int. Je nach Datentyp gibt es auch "tk.DoubleVar ()", "tk.BooleanVar ()" und "tk.StringVar ()". Beachten Sie nur, dass Sie get () / set () verwenden müssen, um Werte auszutauschen, und lassen Sie die Berechnung direkt ablaufen.

View View kümmert sich nur um das Erscheinungsbild und erstellt Komponenten. Für den Teil, der zu einer Variablen wird (Beschriftungstext), wird hier nichts festgelegt.

Controller Der Controller kennt sowohl das Modell als auch die Ansicht, sodass Sie tun können, was Sie wollen. self.view.value_label.config(textvariable=self.model.val) Hier wird IntVar () von Model der Beschriftungskomponente zugewiesen, die den Text von View geleert hat. Auf diese Weise werden die Variablen Modell und Ansicht synchronisiert. Wenn Sie den Wert in Modell ändern, wird er automatisch in Ansicht angezeigt. Darüber hinaus wird die Verarbeitung beim Drücken jeder Taste vom Controller zugewiesen.

Was bedeutet es nicht zu wissen?

"Modell kennt View oder Controller nicht" bedeutet einfach, dass Model keine Instanz von View oder Controller hat.

Angenommen, Sie implementieren Folgendes, damit das Modell über Ansicht verfügt.

class Model:
    def __init__(self, view):
        self.val = 0
        self.view = view

Auf diese Weise können Sie der Ansicht die Änderung mitteilen, wenn sich der Wert des Modells ändert. Zum Beispiel

class Model:
    #・ ・ ・
    def add_one(self):
        self.val += 1
        self.view.label["text"] = str(self.val)  #Reflektieren Sie den angezeigten Wert

Es sieht ziemlich einfach aus und Sie könnten denken, es ist besser als der erste Code. Tatsächlich steigt jedoch die Belastung für die Person, die das Modell implementiert, > < Bei dieser Implementierung muss die für das Modell verantwortliche Person Folgendes wissen, um einen solchen Additionsprozess durchzuführen.

etc

Es besteht auch die Gefahr, dass die Ansicht zerstört wird, wenn das Modell über eine Ansicht verfügt. Es kann auf einen Schlag zerstört werden.

class Model:
    #・ ・ ・
    def balse(self):
        self.view = None

Große Macht geht mit großer Verantwortung einher. Ich möchte so wenig Kraft wie möglich haben.

Damit Klären Sie die Rollenverteilung in MVC und minimieren Sie die Belastung und Verantwortung.


Beiseite

Ich habe nicht viel Erfahrung mit dem Erstellen von GUIs, daher weiß ich nicht, welche Bibliothek besser ist. Ich habe nur tkinter mit Python verwendet, Es wäre hilfreich, wenn Sie mir sagen könnten, was an wxpython und kivy besser ist.

Recommended Posts

MVC mit Tkinter
Werde mit Tkinter Weihnachtsmann
Programmieren mit Python und Tkinter
Einführung in Tkinter 2: Button
Arbeiten Sie mit tkinter und Maus
Bildschirmumschaltung / Bildschirmübergang mit Tkinter
Erstellen Sie den Image Viewer mit Tkinter
Führen Sie Label mit tkinter [Python] aus.
Ich habe den BMI mit tkinter gemessen
Einfache GUI App mit Tkinter Text
Async / warte mit Kivy und tkinter
[Tkinter] Steuert Threads mit Ereignisobjekt
[Python] Erstellen mehrerer Fenster mit Tkinter
Videowiedergabe mit Ton auf Python !! (tkinter / imageio)
Erstellen einer Bildaufteilungs-App mit Tkinter
Machen Sie GUI-Apps mit tkinter ganz einfach
Entwickeln Sie Windows-Apps mit Python 3 + Tkinter (Vorbereitung)
Erstellen Sie eine mit tkinter erstellte ausführbare GUI-Datei
GUI-Bildschneidewerkzeug mit Python + Tkinter
Erstellen Sie eine Matrix mit PythonGUI (tkinter-Kombinationsfeld)
Entwickeln Sie Windows-Apps mit Python 3 + Tkinter (exe-Datei)
Wie man tkinter mit Python in Pyenv benutzt
Laden Sie Bilder mit tkinter mit GUI auf S3 hoch
Iterative (rekursive) Verarbeitung mit tkinter (in der Reihenfolge angezeigt)
Ich habe versucht, mit tkinter mit dem Taschenrechner zu spielen