首页 > 解决方案 > 如何与海龟画布/屏幕尺寸正确交互?

问题描述

我正在尝试使用 Python Turtle 绘制一些图像,而屏幕尺寸/画布尺寸却让我望而却步。

这是我必须创建当前图像的内容:

import turtle
import math
from PIL import Image
import os

t = turtle.Turtle()

Image.MAX_IMAGE_PIXELS = None

screen = turtle.Screen()
fileName = "test"
seedString = fileName

turtle.setup(int(15000),int(15000),int(7500),int(7500))
turtle.screensize(int(15000), int(15000))
turtle.hideturtle()
screen.tracer(False)

t.pen(pensize=2, pencolor='black')

print(screen.screensize())
print(t.pos())

t.color('black')
t.begin_fill()
t.goto(7500,0)
t.right(90)
t.forward(7500)
t.right(90)
t.forward(15000)
t.right(90)
t.forward(15000)
t.right(90)
t.forward(15000)
t.right(90)
t.forward(7500)
t.end_fill()

print(t.pos())

t.goto(0,0)
t.pen(pencolor='white', pensize=5)
t.circle(4000, 360)

print(t.pos())
print(screen.screensize())

canvas = screen.getcanvas()
canvas.postscript(file=fileName, height=15000, width=15000)

img = Image.open(fileName)
img.save(seedString+'.jpg')
img.close()

os.system('move \"'+fileName+'\" somefilelocation')
os.system('move \"'+seedString+'.jpg\" somefilelocation')

根据我的理解,此脚本应将屏幕尺寸设置为 15,000 x 15,000 像素,并使用 turtle.setup() 将原点移动到 (7,500,7,500) 处的中心。我不确定这是画布还是只是我们看到乌龟在其中移动的窗口。但我还包含了 turtle.screensize() 函数将其设置为 15000 x 15000。也许这是多余的,因为它调整了同样的事情,但文档对此有点模糊。

最后,我保存了一个大小相同的 15000 x 15000 像素的 PS 文件,但创建的是这个图像:

缩放乌龟图像

我添加了边框以使图像的实际大小更易于查看。

我正在努力理解的是几件事。如果 setup() 和 screensize() 函数实际上只是更改窗口大小本身,那么我如何更改创建绘图的实际画布的大小。其次,我首先手动绘制一个矩形,该矩形由上面的 goto() 和 right() 函数组合填充为黑色。但是图像本身(这篇文章中的那个是为了大小而缩放的)保存为 11251 x 11251。这不仅对我没有意义,因为我将保存的 PS 文件设置为 15000 x 15000,但即使保存后原始图像是 11251 x 11251 那么为什么是我的矩形,根据我的脚本编写方式,它应该是 15000 x 15000,比这小得多。此外,原点不会出现在黑色矩形或保存的整个画布/图像中心附近的任何地方。

最后,尽管我将范围参数明确设置为 360,但我无法理解为什么 circle() 函数只产生一个半圆。我将它保留为 0,默认为一个完整的圆,它产生了相同的半圆。

我试过只包括设置或屏幕尺寸,使用像 1.0 和像素值这样的绝对值,但似乎没有什么能让我得到我想要的。这是一个 15000 x 15000 像素的图像,从原点绘制一个圆圈,作为画布的中心 (7500,7500)。我知道这不会是圆本身的中心,因为它从边缘开始并从该点到它上方或下方的点(半径,0)创建一个圆。但这不是我的脚本当前的工作方式。

很明显,我没有掌握一个基本的理解。任何帮助都将不胜感激,因为我很想了解更多关于这个库的信息并更好地理解画布/坐标系统以更准确地创建图像。

谢谢!

标签: pythonturtle-graphicspython-turtle

解决方案


你的逻辑有几个缺陷。首先,你在画完之后打电话tracer(False)但从不打电话,这就是你的圈子不完整的原因。screen.update()

其次,虽然 turtle 在 tkinter 上爬行,但它使用的默认坐标系与Canvas. 所以我们需要在Canvas.postscript()方法调用中对此进行调整:

from turtle import Turtle, Screen

WIDTH, HEIGHT = 15_000, 15_000

fileName = "test"

screen = Screen()
screen.setup(WIDTH, HEIGHT)
screen.tracer(False)

turtle = Turtle()
turtle.hideturtle()
turtle.pensize(5)
turtle.penup()

turtle.goto(-WIDTH/2, -HEIGHT/2)

turtle.begin_fill()

for _ in range(2):
    turtle.forward(WIDTH)
    turtle.left(90)
    turtle.forward(HEIGHT)
    turtle.left(90)

turtle.end_fill()

turtle.goto(0, -HEIGHT/4)
turtle.pencolor('white')
turtle.pendown()
turtle.circle(HEIGHT/4)

screen.update()

canvas = screen.getcanvas()
canvas.postscript(file=fileName + ".eps", width=WIDTH, height=HEIGHT, x=-WIDTH/2, y=-HEIGHT/2)

在此处输入图像描述

您会注意到图像宽度/高度(上面未完全显示)为 200 英寸,相当于 15_000 点的英寸(使用每英寸 75 点而不是 72 点。)

我将转换为 JPG 的最后一步留给您。


推荐阅读