mikhail_dvorkin icon

MVC example for 2017a

mikhail_dvorkin | PRO | 03/15/16 09:29:40 AM UTC | 0 ⭐ | 1359 👁️ | Never ⏰ | []
Python |

2.13 KB

|

None

|

0 👍

/

0 👎

 
import tkinter
class Model:
    def __init__(self, n):
        self.__n = n
        self.turn = 0
        self.__field = [[0 for i in range(n)] for j in range(n)]
 
    def n(self):
        return self.__n
 
    def field(self):
        return self.__field # ideally: clone
 
    def process_click(self, x, y):
        if self.__field[x][y]:
            return
        self.__field[x][y] = self.turn + 1
        self.turn ^= 1
 
class View:
    def __init__(self, model):
        self.model = model
 
    def draw(self, canvas):
        canvas.delete("all")
        n = self.model.n()
        field = self.model.field()
        z = 5 # yes, this is ugly, we understand
        for i in range(n):
            for j in range(n):
                cell_size = int(canvas["width"]) // n
                if field[i][j]:
                    color = ("black", "white")[field[i][j] - 1]
                    canvas.create_oval(cell_size * i + z, cell_size * j + z,
                                       cell_size * (i + 1) - z,
                                       cell_size * (j + 1) - z,
                                       fill=color)
 
class Control:
    def __init__(self, n):
        self.model = Model(n)
        self.view = View(self.model)
        self.master = tkinter.Tk()
        self.master.title("MVC for 2017a")
        self.size = 400
        self.master.geometry(str(self.size) + "x" + str(self.size))
        self.canvas = tkinter.Canvas(self.master,
                                     width=self.size,
                                     height=self.size,
                                     bg="#7065ff")
        self.canvas.place(x=0, y=0)
        self.canvas.bind("<Button-1>", self.process_click)
        self.view.draw(self.canvas)
 
    def run(self):
        self.master.mainloop()
 
    def process_click(self, event):
        cell_size = int(self.canvas["width"]) // self.model.n()
        x = event.x // cell_size
        y = event.y // cell_size
        self.model.process_click(x, y)
        self.view.draw(self.canvas)
 
 
control = Control(5) # ask user for n before this
control.run()

Comments