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.
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()
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.
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.
"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.
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