MVC (Model-View-Controller) dans cet article fait référence à la séparation des fonctions conformément à la stratégie suivante. ** Modèle **: Je ne connais ni View ni Controller. Faites simplement le calcul directement. ** Vue **: Je ne connais pas le modèle ou le contrôleur. Seulement à la recherche de la beauté. ** Contrôleur **: Une position divine qui connaît à la fois le modèle et la vue. Il relie le modèle et la vue.
Je ne sais pas quel est le nombre, Étonnamment, je pensais qu'il n'y avait pas beaucoup d'informations sur MVC qui suivent la politique ci-dessus, je vais donc l'écrire sous forme d'article.
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()
Lorsque vous appuyez sur le bouton ADD ONE, le nombre ci-dessus augmente de un. Appuyez sur le bouton RESET pour remettre le nombre ci-dessus à 0.
Model
tk.IntVar ()
est très pratique. J'utilise ceci au lieu des int habituels.
Il existe aussi tk.DoubleVar ()
, tk.BooleanVar ()
et tk.StringVar ()
selon le type de données.
Notez simplement que vous devez utiliser get () / set () pour échanger des valeurs, et laissez le calcul aller droit.
View La vue ne se soucie que de l'apparence et crée des composants. Rien n'est défini ici pour la partie qui devient une variable (texte d'étiquette).
Controller
Le contrôleur connaît à la fois le modèle et la vue, vous pouvez donc faire ce que vous voulez.
self.view.value_label.config(textvariable=self.model.val)
Ici, IntVar () de Model est affecté au composant d'étiquette qui a vidé le texte de View.
En faisant cela, les variables de Model et View seront synchronisées, et si vous modifiez la valeur dans Model, elle sera automatiquement reflétée dans View.
De plus, le traitement lorsque chaque bouton est enfoncé est également attribué par le contrôleur.
«Le modèle ne connaît ni la vue ni le contrôleur» signifie simplement que le modèle n'a pas d'instance de vue ou de contrôleur.
Par exemple, supposons que vous implémentiez ce qui suit pour que Model ait View.
class Model:
def __init__(self, view):
self.val = 0
self.view = view
De cette façon, lorsque la valeur du modèle change, vous pouvez informer la vue du changement. Par exemple
class Model:
#・ ・ ・
def add_one(self):
self.val += 1
self.view.label["text"] = str(self.val) #Refléter la valeur en vue
Cela semble assez facile et vous pourriez penser que c'est mieux que le premier code. Mais en fait, le fardeau de la personne qui met en œuvre le modèle augmente > < Avec cette implémentation, la personne en charge de Model a besoin de connaître les éléments suivants afin d'effectuer un tel processus d'ajout.
etc
Il existe également un risque de destruction de la vue si le modèle a une vue. Il peut être détruit en un seul coup.
class Model:
#・ ・ ・
def balse(self):
self.view = None
Une grande puissance s'accompagne d'une grande responsabilité. Je veux avoir le moins de puissance possible.
Alors Clarifier la répartition des rôles dans MVC et minimiser le fardeau et la responsabilité.
Je n'ai pas beaucoup d'expérience dans la création d'interfaces graphiques, donc je ne sais pas quelle bibliothèque est la meilleure. J'ai seulement utilisé tkinter avec python, Il serait utile que vous me disiez ce qu'il y a de mieux avec wxpython et kivy.
Recommended Posts