beginpath(x=None, y=None)

Start a new Bézier path. This command is needed before any other path drawing commands such as moveto(), lineto(), or curveto(). Finally, the endpath() command draws the path on the screen.

If x and y are not specified, this command should be followed by a moveto() call.

moveto(x, y)

Move the Bézier “pen” to the specified point without drawing.

Can only be called between beginpath() and endpath().

lineto(x, y)

Draw a line from the pen’s current point to the specified (x,y) coordinates.

Can only be called between beginpath() and endpath().

curveto(x1, y1, x2, y2, x3, y3)

Draws a curve between the current point in the path and a new destination point.

The last two parameters are the coordinates of the destination point. The first 4 parameters are the coordinates of the two control points, which define the edge and slant of the curve.

Can only be called between beginpath() and endpath().

x, y = 10, 62     # Start curve point
x1, y1 = 50, 115  # Left control point
x2, y2 = 75, 10   # Right control point
x3, y3 = 115, 62  # End curve point

# Only strokes

# Draw the curve
moveto(x, y)
curveto(x1, y1, x2, y2, x3, y3)

# To show where the control points are,
# we draw helper lines
stroke(1, 0.2, 0.2, 0.6)
# The first control point starts at the
# x, y position
line(x, y, x1, y1)
# And the second control point is the
# end curve point
line(x2, y2, x3, y3)
arcto(x, y, radius, angle1, angle2)

Continues the path with a circular arc in a way identical to arc(). A line will be drawn between the current point and the arc’s starting point.


Close the path; in case the current point is not the path’s starting point, a line will be drawn between them.


The endpath() command is the companion command to beginpath(). When endpath() is called, the path defined between beginpath() and endpath() is drawn. Optionally, when endpath(draw=False) is called, the path is not drawn but can be assigned to a variable and drawn to the screen at a later time with the drawpath() command.


Draws a path on the screen. A path is a series of lines and curves defined between beginpath() and endpath(). Normally, endpath() draws the path to the screen, unless when calling endpath(draw=False). The path can then be assigned to a variable, and this variable used as a parameter for drawpath().

Note: if you have one path that you want to draw multiple times with drawpath(), for example each with its own rotation and position, you need to supply a copy: drawpath(path.copy())

beginpath(10, 10)
lineto(40, 10)
p = endpath(draw=False)

Defines whether paths are automatically closed by connecting the last and first points with a line. It takes a single parameter of True or False. All shapes created with beginpath() following this command will adhere to the setting.

findpath(points, curvature=1.0)

Constructs a fluid path from a list of coordinates. Each element in the list is a 2-tuple defining the x-coordinate and the y-coordinate. If the curve has more than three points, the curvature parameter offers some control on how separate segments are stitched together: from straight lines (0.0) to smooth curves (1.0).

points = [(10, 10), (90, 90), (350, 200)]
for x, y in points:
    ellipse(x, y, 6, 6)

path = findpath(points)

The beginclip() and endclip() commands define a clipping mask. The supplied parameter defines the path to be used as a clipping mask.

All basic shapes and path commands return paths that can be used with beginclip() - setting the draw parameter of a shape command will simply return the path without actually drawing the shape. Any shapes, paths, texts and images between beginclip() and endclip() are clipped: any part that falls outside the clipping mask path is not drawn.

p = ellipse(20, 20, 60, 60, draw=False)
line(20, 20, 80, 80)
line(20, 80, 80, 20)
line(50, 20, 50, 80)