Refactor code in directories + add doc strings
This commit is contained in:
parent
1e5113b208
commit
0d9a636da6
8 changed files with 175 additions and 81 deletions
125
python_symb/tree_visual.py
Normal file
125
python_symb/tree_visual.py
Normal file
|
@ -0,0 +1,125 @@
|
|||
import tkinter as tk
|
||||
from python_symb.Expressions.expr import Expr
|
||||
from python_symb.MathTypes.symbols import Var
|
||||
from python_symb.Parsing.parse import update_symbols_dict
|
||||
|
||||
|
||||
class Visual:
|
||||
def __init__(self):
|
||||
self.root = tk.Tk()
|
||||
self.root.title("Visual")
|
||||
self.root.geometry("1200x1200")
|
||||
|
||||
# Add a canvas on the left side of the window
|
||||
self.tree_canvas = tk.Canvas(self.root, width=800, height=800, bg="white")
|
||||
self.tree_canvas.pack(side=tk.LEFT, expand=False)
|
||||
|
||||
# Create right frame
|
||||
self.right_frame = tk.Frame(self.root, width=300, height=500, background="grey")
|
||||
|
||||
# Add a label with the text "Variables" on top of the right frame, should not take all the space
|
||||
self.variables_label = tk.Label(self.right_frame, text="Variables:")
|
||||
self.variables_label.pack()
|
||||
|
||||
# Add an entry below the label with default text x y z"
|
||||
self.variables_entry = tk.Entry(self.right_frame, width=50)
|
||||
self.variables_entry.insert(0, "x y z")
|
||||
self.variables_entry.pack()
|
||||
|
||||
# Add a button below the entry with the text "Update variables"
|
||||
self.variables_button = tk.Button(self.right_frame, text="Update variables", command=self.update_variables)
|
||||
self.variables_button.pack()
|
||||
|
||||
|
||||
|
||||
# Add a label with the text "Input" on top of the right frame, should not take all the space
|
||||
self.input_label = tk.Label(self.right_frame, text="Input (infix string):")
|
||||
|
||||
|
||||
|
||||
# Add a entry below the label with default text "(5+2)*3"
|
||||
self.input_entry = tk.Entry(self.right_frame, width=50)
|
||||
self.input_entry.insert(0, "(5+2)*3")
|
||||
|
||||
|
||||
|
||||
# Add a button below the entry with the text "To Tree"
|
||||
self.input_button = tk.Button(self.right_frame, text="To Tree", command=self.show_tree)
|
||||
|
||||
# Pack the widgets, make sure they are not expanding, and all are fixed size
|
||||
|
||||
|
||||
self.input_label.pack()
|
||||
self.input_entry.pack()
|
||||
self.input_button.pack()
|
||||
self.right_frame.pack(side=tk.LEFT, expand=False)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
self.root.mainloop()
|
||||
|
||||
def update_variables(self):
|
||||
# Get the text from the entry
|
||||
text = self.variables_entry.get()
|
||||
|
||||
# Create the variables
|
||||
variables = text.split()
|
||||
|
||||
for v in variables:
|
||||
if v not in Var.instances:
|
||||
Var(v)
|
||||
|
||||
# Update the symbols dict
|
||||
update_symbols_dict()
|
||||
|
||||
|
||||
def show_tree(self):
|
||||
# Get the text from the entry
|
||||
text = self.input_entry.get()
|
||||
|
||||
# Clear the canvas
|
||||
self.tree_canvas.delete("all")
|
||||
tree = Expr.from_infix_str(text)
|
||||
|
||||
# Draw the tree
|
||||
self.draw_tree(tree)
|
||||
|
||||
def create_circle(self, x, y, r, color): # center coordinates, radius
|
||||
x0 = x - r
|
||||
y0 = y - r
|
||||
x1 = x + r
|
||||
y1 = y + r
|
||||
return self.tree_canvas.create_oval(x0, y0, x1, y1, fill=color)
|
||||
|
||||
def draw_tree(self, tree, first_x=400, first_y=50, x_offset=250, y_offset=200, radius=30, fact_mult=0.75):
|
||||
print(tree)
|
||||
children = tree.children
|
||||
n = len(children)
|
||||
for i in range(n):
|
||||
child = children[i]
|
||||
x = first_x + (i - (n - 1) / 2) * x_offset
|
||||
y = first_y + y_offset
|
||||
|
||||
#Link the node to the parent
|
||||
self.tree_canvas.create_line(first_x, first_y, x, y)
|
||||
# Draw the node
|
||||
self.draw_tree(child, int(x), y, x_offset*fact_mult, y_offset*fact_mult, radius=radius*fact_mult)
|
||||
|
||||
# Draw the root node
|
||||
self.create_circle(first_x, first_y, radius, "red")
|
||||
self.tree_canvas.create_text(first_x, first_y, text=str(tree.value))
|
||||
|
||||
if __name__ == "__main__":
|
||||
Visual()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue