leftovers
This commit is contained in:
+100
@@ -0,0 +1,100 @@
|
||||
import tkinter as tk
|
||||
import turtle
|
||||
import math
|
||||
|
||||
# ---------- Tk setup ----------
|
||||
root = tk.Tk()
|
||||
root.title("Turtle Function Inspector")
|
||||
|
||||
# ---------- Canvas ----------
|
||||
canvas = tk.Canvas(root, width=600, height=600)
|
||||
canvas.grid(row=0, column=0, rowspan=6)
|
||||
|
||||
screen = turtle.TurtleScreen(canvas)
|
||||
screen.setworldcoordinates(-300, -300, 300, 300)
|
||||
|
||||
t = turtle.RawTurtle(screen)
|
||||
t.speed(0)
|
||||
t.hideturtle()
|
||||
|
||||
# ---------- Globals ----------
|
||||
scale = 40 # zoom level
|
||||
|
||||
# ---------- Drawing ----------
|
||||
def draw_axes():
|
||||
t.clear()
|
||||
t.color("black")
|
||||
t.penup()
|
||||
t.goto(-300, 0)
|
||||
t.pendown()
|
||||
t.goto(300, 0)
|
||||
|
||||
t.penup()
|
||||
t.goto(0, -300)
|
||||
t.pendown()
|
||||
t.goto(0, 300)
|
||||
|
||||
def plot_function():
|
||||
draw_axes()
|
||||
expr = func_entry.get()
|
||||
|
||||
t.color("blue")
|
||||
t.penup()
|
||||
|
||||
first = True
|
||||
for px in range(-300, 300):
|
||||
try:
|
||||
x = px / scale
|
||||
y = eval(expr, {"x": x, "math": math})
|
||||
py = y * scale
|
||||
|
||||
if abs(py) > 300:
|
||||
raise ValueError
|
||||
|
||||
if first:
|
||||
t.goto(px, py)
|
||||
t.pendown()
|
||||
first = False
|
||||
else:
|
||||
t.goto(px, py)
|
||||
except:
|
||||
t.penup()
|
||||
first = True
|
||||
|
||||
# ---------- Zoom ----------
|
||||
def zoom_in():
|
||||
global scale
|
||||
scale *= 1.25
|
||||
plot_function()
|
||||
|
||||
def zoom_out():
|
||||
global scale
|
||||
scale /= 1.25
|
||||
plot_function()
|
||||
|
||||
# ---------- Mouse inspection ----------
|
||||
info = tk.Label(root, text="x=0 y=0")
|
||||
info.grid(row=5, column=1)
|
||||
|
||||
def inspect(event):
|
||||
x = (event.x - 300) / scale
|
||||
try:
|
||||
y = eval(func_entry.get(), {"x": x, "math": math})
|
||||
info.config(text=f"x={x:.3f} y={y:.3f}")
|
||||
except:
|
||||
info.config(text="undefined")
|
||||
|
||||
canvas.bind("<Motion>", inspect)
|
||||
|
||||
# ---------- Controls ----------
|
||||
tk.Label(root, text="f(x) =").grid(row=0, column=1)
|
||||
func_entry = tk.Entry(root, width=20)
|
||||
func_entry.insert(0, "math.sin(x)")
|
||||
func_entry.grid(row=1, column=1)
|
||||
|
||||
tk.Button(root, text="Plot", command=plot_function).grid(row=2, column=1)
|
||||
tk.Button(root, text="Zoom +", command=zoom_in).grid(row=3, column=1)
|
||||
tk.Button(root, text="Zoom -", command=zoom_out).grid(row=4, column=1)
|
||||
|
||||
plot_function()
|
||||
root.mainloop()
|
||||
Reference in New Issue
Block a user