【Python】Tkinterを使った雛形(MVCモデル)


はじめに

最近はPythonのTkinterを使ってGUIアプリケーションを作ることが楽しい日々です。
そして、ただプログラムを組むのではなく、可動性を高めるために、MVCモデルでプログラムを構築しようとしています。ある程度、MVCモデルでの実装で最初の形が定まってきたので、ここに記そうと思います。

環境

  • Windows 10 home
  • Python 3.7.1

MVCモデルによる雛形

Tkinter.py
import tkinter as tk

class Model():
    def __init__(self):
        self.width=self.height=300

class View():
    def __init__(self,master,model):
        self.master = master
        self.model = model

class Controller():
    def __init__(self,master,model,view):
        self.master = master
        self.model = model
        self.view = view

class Application(tk.Frame):
    def __init__(self, master):
        super().__init__(master)
        self.pack()

        self.model = Model()

        master.geometry(str(self.model.width)+"x"+str(self.model.height))
        master.title("雛形")

        self.view = View(master,self.model)
        self.controller = Controller(master,self.model,self.view)

def main():
    win = tk.Tk()
    app = Application(master=win)
    app.mainloop()

if __name__ == "__main__":
    main()

実行

このような画面が出れば、成功です。

実装例

上記の雛形を拡張した例を下記に記します。
スペースキーを押すと三角形の図形が右斜め下に動くものです。

mvcTest.py
import tkinter as tk

class Model():
    def __init__(self):
        self.width=self.height=300

    def moveModel(self,canvas,id):
        canvas.move(id,5,5)

class View():
    def __init__(self,master,model):
        self.master = master
        self.model = model

        self.canvas = tk.Canvas(self.master,width=self.model.width,height=self.model.height)
        self.canvas.pack()

        self.canvas.create_polygon(10,10,10,60,50,35,tag="id1")

class Controller():
    def __init__(self,master,model,view):
        self.master = master
        self.model = model
        self.view = view

        self.master.bind("<space>",self.moveController)

    def moveController(self,event):
        self.model.moveModel(self.view.canvas,"id1")

class Application(tk.Frame):
    def __init__(self,master):
        super().__init__(master)
        self.pack()

        self.model = Model()

        master.geometry(str(self.model.width)+"x"+str(self.model.height))
        master.title("mvcTest")

        self.view = View(master,self.model)
        self.controller = Controller(master,self.model,self.view)

def main():
    win = tk.Tk()
    app = Application(master=win)
    app.mainloop()

if __name__ == "__main__":
    main()

終わりに

まだ私も勉強中なので、この形が完璧なMVCモデルかどうかは保障できません。
参考程度に使ってください。
ここまでこの記事を読んでいただき、ありがとうございました。

応用例

その他書き方