LoginSignup
19

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-05-12

はじめに

最近は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モデルかどうかは保障できません。
参考程度に使ってください。
ここまでこの記事を読んでいただき、ありがとうございました。

応用例

その他書き方

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19