Масштабирование окна в 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 шт):

Автор решения: Сергей Кох
  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()
  1. Если вам требуется динамически масштабировать график, то дополнительно нужно ловить событие изменение размеров окна 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()
→ Ссылка