Search code examples
pythonpython-turtle

Python turtle does not fill shapes


This is intended as a code that prints text in Gothic letters but with turtle. I know it is pointless, but it is a challenge my teacher put to the group.

import turtle

text = "!!!"

sizes = {
    "!": (20, 80, 20)
}
movements = {
    "!": (
        False,
        (90, 200 ** (1 / 2)),
        True,
        (0, 40),
        (-135, 20),
        (-45, 40),
        (-135, 20),
        False,
        (-45, 50),
        True,
        (0, 20),
        (-135, 20),
        (-45, 20),
        (-135, 20)
    )
}


class Letter:
    def __init__(self, _character):
        self.letter = _character
        self.size_x = sizes[_character][0]
        self.size_y = sizes[_character][1]
        self.spacing = sizes[_character][2]
        self.movements = movements[_character]

    def draw(self, _pen):
        _pen.setheading(0)
        _pen.fillcolor("black")
        turtle.begin_fill()
        for movement in self.movements:
            if type(movement) == bool:
                pen.pendown() if movement else pen.penup()
                continue
            pen.right(movement[0])
            pen.forward(movement[1])
        turtle.end_fill()


letters = []

for character in text:
    letters.append(Letter(character))


def goto_absolute(coord_x, coord_y, _pen, screen_width, screen_height):
    _pen.penup()
    _pen.setheading(0)
    _pen.goto((-(screen_width / 2) + coord_x), (screen_height / 2) - coord_y)
    _pen.pendown()


pen = turtle.Turtle()
pen.speed(0)

screen = turtle.Screen()
width = screen.window_width()
height = screen.window_height()

drawn = 0
line = 0

for letter in letters:
    goto_absolute(10 + ((letter.spacing + letter.size_x) * drawn), 10, pen, width, height)
    letter.draw(pen)
    drawn += 1


turtle.done()

When "printed", the letters should be filled with black, even this one because is actually two shapes. Any idea on why?

I have not tried anything but what I showed in the code.


Solution

  • You're mixing turtle, pen, and _pen for operations. Use the _pen passed into the function consistently:

        def draw(self, _pen):
            _pen.setheading(0)
            _pen.fillcolor("black")
            _pen.begin_fill()
            for movement in self.movements:
                if type(movement) == bool:
                    _pen.pendown() if movement else _pen.penup()
                    continue
                _pen.right(movement[0])
                _pen.forward(movement[1])
            _pen.end_fill()