Edited at

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



実行

実行.PNG

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


実装例

上記の雛形を拡張した例を下記に記します。

スペースキーを押すと三角形の図形が右斜め下に動くものです。

1.gif


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モデルかどうかは保障できません。

参考程度に使ってください。

ここまでこの記事を読んでいただき、ありがとうございました。

応用例

その他書き方