-
Notifications
You must be signed in to change notification settings - Fork 0
/
mathobject.py
67 lines (55 loc) · 2.05 KB
/
mathobject.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import config
import tkinter as tk
import random
from utilities import random_color
class MathObject:
"""A mathematical object that can be visualized."""
def __init__(self):
self._label = None # label of the object (e.g. "A") on the canvas
self._canvas: tk.Canvas = (
config.command_interpretter._canvas # the canvas the object will be drawn on
)
self._canvas_items = (
[]
) # the items that are drawn on the canvas to represent this render object (e.g. lines, text, etc.), IMPORTANT: all MathObjects must put all their canvas items in this list
self._color = random_color() # color of the object
self._drawn = False # whether a draw() call has been made for this object
self._line_width = 2 # width of lines drawn for this object
config.command_interpretter.math_objects.append(self)
def clear(self):
"""Clear (erase) the object from the canvas."""
# Remove the object's canvas items
for item in self._canvas_items:
self._canvas.delete(item)
self._canvas_items = []
self._drawn = False
def draw(self):
"""Draws the object on the canvas.
Must be implemented by subclasses, and subclasses must call super().draw() at the start of their implementation."""
self._drawn = True
def redraw(self):
"""Clears then re-draws the object."""
if self._drawn:
self.clear()
self.draw()
@property
def label(self):
return self._label
@label.setter
def label(self, value):
self._label = value
self.redraw()
@property
def color(self):
return self._color
@color.setter
def color(self, value):
self._color = value
self.redraw()
@property
def line_width(self):
return self._line_width
@line_width.setter
def line_width(self, value):
self._line_width = value
self.redraw()