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