如何将乌龟输出作为图像保存?

发布于 2025-02-11 06:40:45 字数 224 浏览 1 评论 0原文

我有一个代码并绘制圆圈。我想将输出作为图像保存。我能够将输出作为.svg文件保存。但是当我尝试打开时,它只显示白页。我还尝试将其转到.jpg或.jpeg版本。再次,我只看到白屏。我该如何解决问题?

from turtle import Screen, Turtle
from random import randint
from svg_turtle import SvgTurtle

I have a code and draw circles. I would like to save the output as image. I am able to save the output as .svg file. But when i try to open, it only shows white page. I also tried to turn it to .jpg or .jpeg version. Again I see only the white screen. How can I solve the problem?

from turtle import Screen, Turtle
from random import randint
from svg_turtle import SvgTurtle

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

腻橙味 2025-02-18 06:40:45

这是一个很好的例子,说明为什么最小的例子是调试中的critcal。删除了所有无关的绘图代码后,您将剩下:

def fiber_circle(fiber):
    # ...
    fiber = Turtle()
    # now start drawing...

# ...
fiber = SvgTurtle(width, height)
fiber_circle(fiber)
# ...

您遇到了很多麻烦,可以创建svgturtle fiber仅将其覆盖普通的旧turtle()实例在您绘制任何内容之前。

删除fiber = turtle()并使用svgturtle fiber而不是。

这会产生新的问题:

  1. 屏幕上没有任何东西出现。
  2. SVG中没有任何东西出现。

可以通过用屏幕乌龟镜像所有光纤命令来解决问题1,甚至对您的用例也可能无关紧要。如果您不关心屏幕,则可以将其保留,或者暂时提出屏幕以验证您的绘图逻辑,以通过Turtle() fiber 交换来验证您的图形逻辑在开发过程中。

问题2似乎是SV​​G库中的一个特征,即它不会为SVG编写Sprite位置。 邮票而不是showturtle工作。

这是一个新版本,通过一些简化实现这些更改(MAP过于复杂):

from random import randint
from svg_turtle import SvgTurtle
from turtle import Turtle


def fiber_circle(fiber, width, height):
    fiber_r = 35
    fiber_num = 50
    cursor_size = 20
    fiber.hideturtle()
    fiber.color("black")
    fiber.shape("circle")
    fiber.shapesize(fiber_r / cursor_size)
    fiber.speed("fastest")
    fiber.penup()
    fibers = []

    for _ in range(fiber_num):
        fiberr = fiber.clone()
        fiberr.setposition(
            randint(fiber_r - width / 2, width / 2 - fiber_r),
            randint(fiber_r - height / 2, height / 2 - fiber_r),
        )

        while any((a.distance(fiberr) < fiber_r for a in fibers)):
            fiberr.setposition(
                randint(fiber_r - width / 2, width / 2 - fiber_r),
                randint(fiber_r - height / 2, height / 2 - fiber_r),
            )

        fiberr.stamp()
        fibers.append(fiberr)

def write_file(fiber_circle, filename, width, height):
    fiber = SvgTurtle(width, height)
    fiber_circle(fiber, width, height)
    fiber.save_as(filename)

def main():
    write_file(fiber_circle, "fiber.svg", 500, 500)
    print("Done.")


if __name__ == "__main__":
    main()

This is a good example of why a minimal example is critcal in debugging. Once you remove all of the irrelevant drawing code, you're left with:

def fiber_circle(fiber):
    # ...
    fiber = Turtle()
    # now start drawing...

# ...
fiber = SvgTurtle(width, height)
fiber_circle(fiber)
# ...

You've gone through a lot of trouble to create a SvgTurtle fiber only to overwrite it with a plain old Turtle() instance before you draw anything with it.

Remove fiber = Turtle() and use the SvgTurtle fiber instead.

This creates new problems:

  1. Nothing shows up on the screen.
  2. Nothing shows up in the SVG.

Problem 1 can be solved by mirroring all fiber commands with a Screen turtle and may not even matter for your use case. If you don't care about the screen, you can keep it off, or temporarily bring it up to validate your drawing logic by swapping in a Turtle() for the fiber during development.

Problem 2 seems to be a characteristic in the SVG library which is that it doesn't write sprite positions to SVG. stamp rather than showturtle works.

Here's a new version that implements these changes with a few simplifications (map was overly complex):

from random import randint
from svg_turtle import SvgTurtle
from turtle import Turtle


def fiber_circle(fiber, width, height):
    fiber_r = 35
    fiber_num = 50
    cursor_size = 20
    fiber.hideturtle()
    fiber.color("black")
    fiber.shape("circle")
    fiber.shapesize(fiber_r / cursor_size)
    fiber.speed("fastest")
    fiber.penup()
    fibers = []

    for _ in range(fiber_num):
        fiberr = fiber.clone()
        fiberr.setposition(
            randint(fiber_r - width / 2, width / 2 - fiber_r),
            randint(fiber_r - height / 2, height / 2 - fiber_r),
        )

        while any((a.distance(fiberr) < fiber_r for a in fibers)):
            fiberr.setposition(
                randint(fiber_r - width / 2, width / 2 - fiber_r),
                randint(fiber_r - height / 2, height / 2 - fiber_r),
            )

        fiberr.stamp()
        fibers.append(fiberr)

def write_file(fiber_circle, filename, width, height):
    fiber = SvgTurtle(width, height)
    fiber_circle(fiber, width, height)
    fiber.save_as(filename)

def main():
    write_file(fiber_circle, "fiber.svg", 500, 500)
    print("Done.")


if __name__ == "__main__":
    main()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文