Масштабирование окна в Turtle Python
Для проекта нужно реализовать программу с графическим интерфейсом для построения графика. При этом при изменении размеров окна графика, сам график должен масштабироваться.Окно с графиком написано с помощью Turtle. Не могу понять как сделать обработчик такого события. Пытался сделать как в Canvas:
def config(event): # функция которая реагирует на передвижение и масштабирование окна
if event.widget == turtle:
global scale
scale = 0.0625*turtle.window_height()
MainWork(R, Coord, scale)
но Turtle не реагирует на этот код, точнее он вообще не реагирует, когда ты меняешь размеры окна.
Код:
from turtle import *
import turtle
import math
from tkinter import *
from tkinter import messagebox
root = Tk()
def config(event): # функция которая реагирует на передвижение и масштабирование окна
if event.widget == turtle:
global scale
scale = 0.0625*turtle.window_height()
MainWork(R, Coord, scale)
def MainWork(R, Coord, scale):
if Coord == 1: #Декартовая система координат
GraphSetup()
DrawDecard(scale)
DefaultTurtle()
GraphDraw(R,scale)
AnimDraw(R, scale)
def GraphSetup():
turtle.setup (500, 500)
tracer(False)
turtle.title("Вариант №1")
def DefaultTurtle(): #Для графика
tracer(True)
hideturtle()
color("black")
width(3)
speed(1)
up()
home()
down()
def CellsTurtle():
tracer(False)
hideturtle()
color("black")
width(1)
speed(0)
up()
goto(-390, 390)
down()
def SystemTurtle(): #Для СК
tracer(False)
hideturtle()
width(2)
color("grey")
speed(0)
up()
home()
down()
def AnimTurtle():
tracer(True)
up()
showturtle()
shape("square")
color("black", "blue")
turtlesize(1,1,3)
speed(1)
def DrawBetween(x1,y1,x2,y2):
up()
goto(x1, y1)
down()
goto(x2, y2)
up()
def AnimBetween(x1, y1, x2, y2):
up()
goto(x1, y1)
tracer(True)
goto(x2, y2)
tracer(False)
def DrawDecard(scale): #Для построения Декартовой СК
SystemTurtle() #Построение Декартовой СК
up()
color("black")
goto(xcor()+3, ycor()+3)
write(0)
color("grey")
for i in range(0, 360, 90):
up()
home()
left(i)
for k in range(scale, 390, scale):
down()
forward(scale)
left(90)
forward(5)
backward(10)
forward(5)
right(90)
up()
goto(xcor()+3, ycor()+3)
color("black")
if i > 90:
write(-1* int(k/scale))
else:
write(int(k/scale))
color("grey")
goto(xcor()-3, ycor()-3)
DefaultTurtle()
def GraphDraw(perem, scale): #Построение графика в Декартовой СК
DefaultTurtle()
tracer(False)
r = perem * scale
for x in range(0, r, 1): # I ч.
y = math.sqrt(math.pow(r, 2)-(3*r*math.pow(r*x*x, 1/3))+(3*x*math.pow(r*r*x, 1/3))-math.pow(x, 2))
goto(x,y)
for x in range(r, 0, -1): # VI ч.
y = math.sqrt(math.pow(r, 2)-(3*r*math.pow(r*x*x, 1/3))+(3*x*math.pow(r*r*x, 1/3))-math.pow(x, 2))
goto(x, -y)
for x in range(0, r, 1): # III ч.
y = math.sqrt(math.pow(r, 2)-(3*r*math.pow(r*x*x, 1/3))+(3*x*math.pow(r*r*x, 1/3))-math.pow(x, 2))
goto(-x, -y)
for x in range(r, 0, -1): # II ч.
y = math.sqrt(math.pow(r, 2)-(3*r*math.pow(r*x*x, 1/3))+(3*x*math.pow(r*r*x, 1/3))-math.pow(x, 2))
goto(-x, y)
up()
def AnimDraw(perem, scale): #Построение Анимации в Декартовой СК
AnimTurtle()
r = perem * scale
for x in range(0, r, 1): # I ч.
y = math.sqrt(math.pow(r, 2) - (3 * r * math.pow(r * x * x, 1 / 3)) + (3 * x * math.pow(r * r * x, 1 / 3)) - math.pow(x,2))
goto(x, y)
for x in range(r, 0, -1): # VI ч.
y = math.sqrt(math.pow(r, 2) - (3 * r * math.pow(r * x * x, 1 / 3)) + (3 * x * math.pow(r * r * x, 1 / 3)) - math.pow(x,2))
goto(x, -y)
for x in range(0, r, 1): # III ч.
y = math.sqrt(math.pow(r, 2) - (3 * r * math.pow(r * x * x, 1 / 3)) + (3 * x * math.pow(r * r * x, 1 / 3)) - math.pow(x,2))
goto(-x, -y)
for x in range(r, 0, -1): # II ч.
y = math.sqrt(math.pow(r, 2) - (3 * r * math.pow(r * x * x, 1 / 3)) + (3 * x * math.pow(r * r * x, 1 / 3)) - math.pow(x,2))
goto(-x, y)
up()
def main():
MainWork(2, 1, 50)
main()
Ответы (1 шт):
- Если вам надо статически масштабировать график, то достаточно использовать пользовательскую систему координат:
Syntax : turtle.setworldcoordinates(llx, lly, urx, ury)
Parameters:
llx: a number, x-coordinate of lower left corner of canvas lly: a number, y-coordinate of lower left corner of canvas urx: a number, x-coordinate of upper right corner of canvas ury: a number, y-coordinate of upper right corner of canvas
Например:
import turtle
coords = 20
def draw():
for i in range(10):
turtle.forward(1 + 1 * i)
turtle.right(90)
screen = turtle.Screen()
screen.mode('world')
screen.setworldcoordinates(-coords, -coords, coords, coords)
draw()
screen.reset()
h = screen.window_height()
w = screen.window_width()
screen.setup(w // 2, h // 2)
coords1 = coords * 2
screen.setworldcoordinates(-coords1, -coords1, coords1, coords1)
draw()
screen.mainloop()
- Если вам требуется динамически масштабировать график, то дополнительно нужно ловить событие изменение размеров окна
screen.getcanvas().bind("<Configure>", resize), затем расчитывать коэффициент масштабирования, затем перерисовывать все. Заготовка распечатывает в консоли коэффициент динамического пересчета, при изменении размеров окна.
from turtle import *
width = 500
height = 500
def DrawDecard(scale): # Для построения Декартовой СК
pass
def GraphSetup():
screen.setup(width, height)
title("Вариант №1")
def resize(event):
global width, height
w_scale = event.width / width
h_scale = event.height / height
scale = min(w_scale, h_scale)
print(scale)
width = event.width
height = event.height
DrawDecard(scale)
screen = Screen()
GraphSetup()
screen.getcanvas().bind("<Configure>", resize)
screen.mainloop()