42

I would like to figure out how to save a bitmap or vector graphics image after creating a drawing with python's turtle module. After a bit of googling I can't find an easy answer. I did find a module called canvas2svg, but I'm very new to python and I don't know how to install the module. Is there some built in way to save images of the turtle canvas? If not where do I put custom modules for python on an Ubuntu machine?

martineau
  • 119,623
  • 25
  • 170
  • 301
jjclarkson
  • 5,890
  • 6
  • 40
  • 62
  • In the event you want to transparently save an image at the end of the program's execution (semi-useful for assisting with grading student assignments that terminate), please check out: https://github.com/ucsb-cs/cTurtle_screenshot – bboe Jan 16 '14 at 19:10

2 Answers2

54
from tkinter import *  # Python 3
#from Tkinter import *  # Python 2
import turtle


turtle.forward(100)
ts = turtle.getscreen()

ts.getcanvas().postscript(file="duck.eps")

This will help you; I had the same problem, I Googled it, but solved it by reading the source of the turtle module.

The canvas (tkinter) object has the postscript function; you can use it.

The turtle module has "getscreen" which gives you the "turtle screen" which gives you the Tiknter canvas in which the turtle is drawing.

This will save you in encapsulated PostScript format, so you can use it in GIMP for sure but there are other viewers too. Or, you can Google how to make a .gif from this. You can use the free and open source Inkscape application to view .eps files as well, and then save them to vector or bitmap image files.

Al Sweigart
  • 11,566
  • 10
  • 64
  • 92
KilyenOrs
  • 1,456
  • 1
  • 20
  • 26
8

I wrote the svg-turtle package that supports the standard Turtle interface from Python, and writes an SVG file using the svgwrite module. Install it with pip install svg-turtle, and then call it like this:

from svg_turtle import SvgTurtle


def draw_spiral(t):
    t.fillcolor('blue')
    t.begin_fill()
    for i in range(20):
        d = 50 + i*i*1.5
        t.pencolor(0, 0.05*i, 0)
        t.width(i)
        t.forward(d)
        t.right(144)
    t.end_fill()


def write_file(draw_func, filename, width, height):
    t = SvgTurtle(width, height)
    draw_func(t)
    t.save_as(filename)


def main():
    write_file(draw_spiral, 'example.svg', 500, 500)
    print('Done.')


if __name__ == '__main__':
    main()

The canvasvg package is another option. After you run some turtle code, it will convert all the items on the tkinter canvas into an SVG file. This requires tkinter support and a display, where svg-turtle doesn't.

Don Kirkby
  • 53,582
  • 27
  • 205
  • 286
  • 1
    I believe you should have `draw_spiral()` --> `draw_spiral()` In `def write_file` – Mr.Weathers Feb 05 '18 at 07:59
  • 1
    I assume you meant `draw_spiral()` --> `draw_func()`, @Mr.Weathers. You're right, that's what I meant to do, so I've fixed it. – Don Kirkby Feb 05 '18 at 20:29
  • Awesome, problem is that in this way the _Screen object loose a lot attributes because it get overridden by the SvgTurtle screen. You are loose a lot of flexibility to compose the image in several draw pass like clear() or getting the screensize and using it in your function... – diramazioni Oct 04 '20 at 21:31
  • 1
    My new version supports a lot more features from the standard `Turtle`, @diramazioni. – Don Kirkby Jan 17 '22 at 16:59