[PYTHON] MVC avec Tkinter

introduction

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.

Coder soudainement

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

Produit fini

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

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.

Commentaire

Que se passe-t-il?

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.

Que signifie ne pas savoir?

«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é.


De côté

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

MVC avec Tkinter
Devenez Père Noël avec Tkinter
Programmation avec Python et Tkinter
Introduction à Tkinter 2: Button
Travailler avec le tkinter et la souris
Changement d'écran / transition d'écran avec Tkinter
Créer une visionneuse d'images avec Tkinter
Exécuter Label avec tkinter [Python]
J'ai mesuré l'IMC avec tkinter
Application GUI facile avec Tkinter Text
Async / await avec Kivy et tkinter
[Tkinter] Contrôler les threads avec l'objet Event
[Python] Création de plusieurs fenêtres avec Tkinter
Lecture vidéo avec son sur python !! (tkinter / imageio)
Créer une application de fractionnement d'image avec Tkinter
Rendez les applications GUI super faciles avec tkinter
Développer des applications Windows avec Python 3 + Tkinter (Préparation)
Créer un fichier exécutable GUI créé avec tkinter
Outil de rognage d'image GUI réalisé avec Python + Tkinter
Créer une matrice avec PythonGUI (combo tkinter)
Développer des applications Windows avec Python 3 + Tkinter (fichier exe)
Comment utiliser tkinter avec python dans pyenv
Télécharger des images sur S3 avec une interface graphique à l'aide de tkinter
Traitement itératif (récursif) avec tkinter (affiché dans l'ordre)
J'ai essayé de jouer avec la calculatrice avec tkinter