Advertisement
mikhail_dvorkin

MVC example for 2017a

Mar 15th, 2016
905
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.13 KB | None | 0 0
  1.  
  2. import tkinter
  3. class Model:
  4.     def __init__(self, n):
  5.         self.__n = n
  6.         self.turn = 0
  7.         self.__field = [[0 for i in range(n)] for j in range(n)]
  8.  
  9.     def n(self):
  10.         return self.__n
  11.  
  12.     def field(self):
  13.         return self.__field # ideally: clone
  14.  
  15.     def process_click(self, x, y):
  16.         if self.__field[x][y]:
  17.             return
  18.         self.__field[x][y] = self.turn + 1
  19.         self.turn ^= 1
  20.  
  21. class View:
  22.     def __init__(self, model):
  23.         self.model = model
  24.  
  25.     def draw(self, canvas):
  26.         canvas.delete("all")
  27.         n = self.model.n()
  28.         field = self.model.field()
  29.         z = 5 # yes, this is ugly, we understand
  30.         for i in range(n):
  31.             for j in range(n):
  32.                 cell_size = int(canvas["width"]) // n
  33.                 if field[i][j]:
  34.                     color = ("black", "white")[field[i][j] - 1]
  35.                     canvas.create_oval(cell_size * i + z, cell_size * j + z,
  36.                                        cell_size * (i + 1) - z,
  37.                                        cell_size * (j + 1) - z,
  38.                                        fill=color)
  39.  
  40. class Control:
  41.     def __init__(self, n):
  42.         self.model = Model(n)
  43.         self.view = View(self.model)
  44.         self.master = tkinter.Tk()
  45.         self.master.title("MVC for 2017a")
  46.         self.size = 400
  47.         self.master.geometry(str(self.size) + "x" + str(self.size))
  48.         self.canvas = tkinter.Canvas(self.master,
  49.                                      width=self.size,
  50.                                      height=self.size,
  51.                                      bg="#7065ff")
  52.         self.canvas.place(x=0, y=0)
  53.         self.canvas.bind("<Button-1>", self.process_click)
  54.         self.view.draw(self.canvas)
  55.  
  56.     def run(self):
  57.         self.master.mainloop()
  58.  
  59.     def process_click(self, event):
  60.         cell_size = int(self.canvas["width"]) // self.model.n()
  61.         x = event.x // cell_size
  62.         y = event.y // cell_size
  63.         self.model.process_click(x, y)
  64.         self.view.draw(self.canvas)
  65.  
  66.  
  67. control = Control(5) # ask user for n before this
  68. control.run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement