Python:海龟大小(像素)

3 投票
4 回答
12660 浏览
提问于 2025-04-20 07:37

我遇到了一个问题。我想知道我在Python中使用的海龟(turtle)的像素大小,但我该怎么做呢?

4 个回答

1

Python里的海龟图形(turtle)大小和行为的表现其实不太直观。虽然我懒得去看所有的实现代码,但我可以简单解释一下这个情况。

有人指出,默认的方形海龟的实际大小确实是21x21。不过,当你试着用shapesize()来调整它的大小时,你会发现一些奇怪的现象。如果你写了类似这样的代码:

turtle.shapesize(stretch_wid=2, stretch_len=0.5)

理论上,结果的宽度应该是42,长度应该是10(向下取整)或11(向上取整)。但实际上,我们看到的新长度是11,而新宽度却是41。

这一切要说得通,前提是默认的方形海龟实际大小是20x20,但在屏幕上显示的是21x21。在我的测试中,它显示的大小分别是81x81、41x41、11x11和6x6,而不是80x80、40x40、10x10和5x5。这个假设也能解释为什么给一个拉伸因子0.95会得到一个20x20的方形海龟:20乘以0.95是19,但最后的结果在两个方向上都多了一个像素,所以你在屏幕上看到的最终是一个20x20的方形海龟。

虽然CPython实现的海龟模块可能没有问题,但我想大家都能同意这设计得很糟糕。因此,我强烈建议你在做动画项目时使用Pygame,而在处理静态或帧率非常低的图形时使用Tkinter。即使你想挑战自己,海龟模块也可能让你很头疼,最好还是找个替代方案。

1

我完全明白你的意思,形状大小并不等于像素宽度,这让我困惑了好几天。

最后我把海龟的形状改成了一个正方形,然后在Windows里用“打印屏幕”功能截取了画布上正方形海龟的快照。接着我把这个截图放到Photoshop里,放大到可以看到像素网格。我发现默认的正方形海龟大小是21x21像素,谁知道为什么它是21呢?不过我发现如果我想让海龟的大小是像素,比如20,然后把20除以21,就得到了0.9523……

把这个值四舍五入到0.95,然后放到形状大小里,就得到了一个正好是20x20像素的正方形海龟,这样操作起来就简单多了。你可以用任何你想要的像素值来调整海龟的大小,不过我只试过正方形海龟。

希望这对你有帮助,或者能给你一些关于如何找到海龟像素大小的思路。用画图工具也可以做到这一点,只要你去“视图”选项卡,打开网格,然后尽量放大。

2

大多数标准形状都可以放进一个21 x 21的正方形里。箭头、三角形和经典形状都要小得多,而且乌龟的脚并没有完全放在正方形的底部,头部还突出得很远。

乌龟形状

乌龟形状 - Python代码

为什么是21 x 21呢?我想是因为这样可以让乌龟正好在一个像素的中心,而不是在两个像素之间的中心,这样可以让圆形看起来更对称,也能让笔画得更准确。

4

海龟的形状是存储在一个字典里的,这个字典在 TurtleScreen 类中。比如,形状 square 的键就包含了:

Shape("polygon", ((10,-10), (10,10), (-10,10), (-10,-10)))

所有的光标形状看起来都能放进这个 20 x 20 的正方形里。当我用 shapesize() 编程时,我会这样做:

STAMP_SIZE = 20
...
turtle.shapesize(size / STAMP_SIZE)

这里的 size 是我想要的光标大小(或者说小)。这个大小不一定要一样,有时候我会通过以下方式画线:

turtle.shapesize(size / STAMP_SIZE, 1 / STAMP_SIZE)  # vertical line

记住,shapesize() 的宽度和长度参数是相对于海龟的方向的,所以 宽度 是海龟指向的方向,而 长度 是与之垂直的方向。

如果你真的想知道当前海龟光标的尺寸(包括经过任何变换后的尺寸),你可以使用 turtle.get_shapepoly()。不过这会给你一个多边形,所以你需要从多边形的顶点中计算出高度、宽度、面积或者你需要的其他信息。

撰写回答