Artigos

Desenhando com o Módulo Python Turtle

img

"Great things are done by a series of small things brought together."

— Vincent van Gogh

Introdução

Turtle graphics é uma forma popular de apresentar a programação às crianças. Era parte da linguagem de programação Logo desenvolvida por Wally Feurzeig, Seymour Papert e Cynthia Solomon em 1967.

Imagine uma tartaruga robótica começando em (0, 0) no plano x-y. Depois de importar turtle (import turtle), é possível dar comandos a ela, como por exemplo turtle.forward(100), e então ela se move (na tela!) 100 pixels na direção para a qual está voltada, desenhando uma linha conforme se move. Dar a ela o comando turtle.right(90), faz ela girar 90 graus no local no sentido horário.

Ao combinar esses comandos e outros semelhantes, formas e imagens complexas podem ser facilmente desenhadas.

A Biblioteca Turtle

turtle é uma biblioteca Python pré-instalada que permite aos usuários criar imagens e formas fornecendo-lhes uma tela de pintura virtual. A caneta na tela que usamos para desenhar é chamada de turtle e é isso que dá nome à biblioteca. Em resumo, a biblioteca Python turtle ajuda os novos programadores a ter uma ideia de como é a programação com Python de uma forma divertida e interativa.

Uma vez que a biblioteca turtle já é construída no Python, então não precisamos instalar nenhum pacote, apenas devemos ter o Python em nossa máquina e então importá-la em nosso ambiente.

Neste exemplo vamos abrir o interpretador do Python digitando o seguinte comando em nosso terminal:

python3

Se desejar, você pode optar pelo interpretador online REPL.

Agora que temos acesso ao interpretador de comandos da linguagem Python, podemos finalmente importar o módulo turtle:

import turtle

Uma vez que a biblioteca turtle está em nosso ambiente Python, podemos começar a programar com ela. turtle é uma biblioteca gráfica, o que significa que precisaremos criar uma janela separada (chamada de tela) para executar cada comando de desenho. Podemos criar essa tela inicializando uma variável para ela da seguinte maneira:

s = turtle.getscreen()

Ao executarmos o comando acima, veremos que será aberta uma janela separada:

img

Esta janela é chamada de tela. É onde podemos ver o output de nosso código.

É possível alterarmos a dimensão da tela com o comando setup, por exemplo, se quisermos deixá-la 400x400:

s.setup(400,400)

A pequena forma triangular preta no meio da tela é chamada de turtle. É possível escondermos ela com o comando hideturtle():

turtle.hideturtle()

Observe que ao executarmos este comando, ele fará com que a turtle desapareça, para fazermos com que ela apareça novamente, podemos usar o comando Turtle().

Em seguida, vamos inicializar uma variável t, que será usada em todo o programa para se referir à turtle:

t = turtle.Turtle()

Finalmente temos a tela e a turtle, que neste caso será referenciada pela variável t. A tela atua como uma tela de pintura, enquanto a turtle atua como uma caneta. Podemos programar a turtle para se mover pela tela. A turtle tem certas características mutáveis, como tamanho, cor e velocidade. Ele sempre aponta para uma direção específica e se moverá nessa direção, a menos que digamos o contrário:

  • Quando a caneta estiver para cima (up), significa que nenhuma linha será desenhada quando ela se mover.
  • Quando a caneta está para baixo (down), significa que uma linha será desenhada quando ela se mover.

Programando com Turtle

Como já vimos, a turtle inicia na posição (0,0) no plano x-y e podemos obter sua posição atual através do comando position ou pos:

t.position() # (0.00,0.00)
t.pos() # (0.00,0.00)

Movendo a Turtle

É possível mover a turtle em quatro direções diferentes:

  • Forward (Para frente)
  • Backward (Para trás)
  • Left (Esquerda ou Anti-Horário)
  • Right (Direita ou Horário)

Para compreendermos melhor estas ideias, vamos experimentar alguns comandos.

Começamos alterando a direção da turtle em 90 graus para a esquerda:

t.left(90)

Estamos agora apontando para o norte, vamos então nos mover 100 unidades para frente:

t.forward(100)

Novamente, vamos alterar a direção da turtle em 180 graus para a direita:

t.right(180)

Estamos agora apontando para o sul, vamos então nos mover 100 unidades para trás:

t.backward(100)

Eventualmente obteremos o seguinte resultado:

img

É possível também usar atalhos para estes comandos:

  • t.rt() para t.right()
  • t.fd() para t.forward()
  • t.lt() para t.left()
  • t.bk() para t.backward()

Podemos também traçar uma linha de nossa posição atual para qualquer outra posição arbitrária na tela. Isso é feito com o auxílio das coordenadas:

img

A tela é dividida em quatro quadrantes. O ponto onde a tartaruga é inicialmente posicionada no início do programa é (0,0). Este ponto é chamado de Home.

Para mover a tartaruga para qualquer outra área da tela, podemos usar o comando goto() e inserir as coordenadas desta forma:

t.goto(-100,100)

Nossa turtle irá se mover diretamente ao ponto (-100,100), desenhando uma linha:

img

Para fazermos a turtle retornar à posição home, podemos usar o seguinte comando:

t.home()

Perceba que home() é apenas um atalho, o comando t.goto(0,0) teria o mesmo efeito.

Desenhando Formas Geométricas

Podemos começar desenhando polígonos, que consistem em linhas retas conectadas em determinados ângulos.

Com a ajuda de um for loop, podemos facilmente desenhar um octógono:

for _ in range(8):
    t.rt(45)
    t.fd(65)

O output do código será o seguinte:

img

Podemos seguir uma lógica similar para desenhar um triângulo:

for _ in range(3):
    t.fd(150)
    t.left(120)

Que nos trará o seguinte resultado:

img

A biblioteca turtle nos oferece um comando chamado de circle() que nos permite desenhar círculos:

t.circle(80)

O número entre parênteses é o raio do círculo. Podemos aumentar ou diminuir o tamanho do círculo, alterando o valor de seu raio. Como output veremos um círculo:

img

Da mesma forma, podemos também desenhar um ponto, que nada mais é do que um círculo preenchido. Para esta tarefa devemos usar o comando dot():

t.dot(50)

Que nos apresentará:

img

Comandos Úteis

Alterando a Cor da Tela

Por padrão, turtle sempre abre uma tela com um fundo branco. Entretanto, podemos alterar a cor da tela a qualquer momento usando o seguinte comando:

turtle.bgcolor('gray')

Imediamente podemos observar que a cor de nossa tela irá alterar para cinza:

img

Neste caso estamos usando a cor gray (cinza), também podemos usar cores como green (verde) e red (vermelho). Neste site você pode ver uma lista com diversos nomes de cores: Trinket.io

Além disso, é possível informarmos o valor hexadecimal de uma cor. Portanto, se quisermos retornar para o branco, podemos digitar um dos seguintes comandos:

turtle.bgcolor('#ffffff')
turtle.bgcolor('white')

Ambos são válidos e produzem o mesmo efeito.

Alterando o Título da Tela

É possível também alterarmos o título da nossa tela com o comando title(). Por exemplo:

turtle.title("Aprendendo Python com a biblioteca Turtle!")

Veja que o texto de nossa barra de título será alterado:

img

Dessa maneira, podemos alterar o cabeçalho da tela de acordo com a nossa preferência.

Alterando o Tamanho da Turtle

Podemos aumentar ou diminuir o tamanho da turtle na tela para torná-la maior ou menor. Isso altera apenas o tamanho da forma da turtle, sem afetar o output da caneta conforme ela desenha na tela, por exemplo:

t.shapesize(5,5,10)

Aqui estamos passando os seguintes parâmetros para alterar o tamanho da turtle:

  • Comprimento
  • Largura
  • Largura do contorno

Neste caso teremos o seguinte output:

img

Alterando o Tamanho da Caneta

O comando anterior foi responsável por mudar apenas o tamanho da forma da turtle. No entanto, às vezes, pode ser necessário aumentar ou diminuir a espessura da caneta, para esta tarefa podemos usar o seguinte comando:

t.pensize(8)
t.goto(150,150)

Imediamente podemos ver o resultado:

img

Observe que aumentou a espessura da linha traçada pela turtle.

Alterando a Forma da Turtle

A forma inicial da turtle não é realmente uma tartaruga, mas uma figura triangular. Entretanto, é possível alterarmos a aparência da turtle e para isso nos é fornecido algumas opções, por exemplo:

t.shape("turtle")
t.shape("arrow")
t.shape("circle")
t.shape("triangle")
t.shape('classic')
t.shape('square')

A forma da turtle irá alterar de acordo com a sua escolha, neste caso eu optei pela turtle:

img

Alterando Cores

Ao abrirmos uma nova tela pela primeira vez, a turtle começa como uma figura preta e desenha com tinta preta. Com base em seus requisitos, podemos fazer duas coisas:

  • Alterar a cor da turtle: Isso altera a cor de preenchimento.
  • Alterar a cor da caneta: Isso altera o contorno ou a cor da tinta.

Também é possível (se desejarmos) alterar ambos.

Para alterarmos a cor da tartaruga (ou o preenchimento), devemos digitar o seguinte comando:

t.fillcolor("green")

Para alterarmos a cor da caneta (ou contorno), digitamos o seguinte:

t.pencolor("#4da364")

Também é possível alterarmos ambos de uma só vez:

t.color("#4da364","green")

No exemplo acima, a primeira cor é para a caneta e a segunda é para o preenchimento. Observe que alterar a cor da caneta e do preenchimento também altera a cor da tartaruga na tela de acordo, nos trazendo o seguinte resultado:

img

Preenchendo uma Figura

É possível preenchermos uma figura com uma cor escolhida. Quando usamos o comando begin_fill(), estamos dizendo ao programa que vamos desenhar uma forma fechada que precisará ser preenchida. Em seguida, usamos end_fill() para indicar que terminamos de criar a forma e agora ela pode ser preenchida.

O script a seguir desenha uma série de figuras geométricas e as preenche com uma cor escolhida por nós:

# Importando o módulo Turtle
import turtle

# Definindo o título da janela
turtle.title('Meu Desenho')

# Abrindo a tela de desenhos
screen = turtle.Screen()
screen.bgcolor('#6b1ac7')
screen.setup(650,650)

# Inicializando e configurando a tartaruga
tartaruga = turtle.Turtle()
tartaruga.shape('turtle') 
tartaruga.color('#00ffee') 
tartaruga.shapesize(2,2,2)
tartaruga.speed(1)
tartaruga.pen(fillcolor="#2b00ff", pensize=4)

# Desenha diversos círculos
for i in range(150,30,-20):
    tartaruga.begin_fill()
    tartaruga.circle(i)
    tartaruga.end_fill()
    tartaruga.hideturtle()

tartaruga.dot(35)
# Transformando a tartaruga em um círculo
tartaruga.shape('circle')
tartaruga.showturtle()

# Desenhando o triângulo
tartaruga.begin_fill()
tartaruga.rt(90)
tartaruga.fd(170)
tartaruga.dot(35)
tartaruga.lt(40)
tartaruga.fd(150)
tartaruga.rt(130)
tartaruga.fd(195)
tartaruga.rt(130)
tartaruga.fd(150)
tartaruga.end_fill()
tartaruga.hideturtle()

# Finalizando o desenho
turtle.done()

Como output temos o seguinte desenho:

img

Observe que neste exemplo também utilizamos os comandos speed() e pen() que veremos em mais detalhes a seguir.

Alterando a Velocidade da Caneta

A turtle normalmente se move em um ritmo moderado. Se quisermos diminuir ou aumentar a velocidade para fazer ela se mover mais devagar ou mais rápido, podemos fazer isso com o comando speed():

t.speed(0)
t.speed(10)

A velocidade que podemos oferecer varia entre 0 e 10, se o input for um número maior que 10 ou menor que 0.5, a velocidade é definida como 0. Speedstrings são mapeados para valores de velocidade da seguinte forma:

  • “Mais rápido”: 0
  • “Rápido”: 10
  • “Normal”: 6
  • “Lento”: 3
  • “Mais lento”: 1

Importante lembrarmos que se a velocidade for igual a 0, então não haverá animação.

Customizando em uma Linha

Imagine agora que desejamos atribuir as seguintes características para a nossa turtle:

  • Cor da Caneta: roxo (purple)
  • Cor de Preenchimento: rosa (pink)
  • Tamanho da Caneta: 6
  • Velocidade da Caneta: 2

Podemos setar todas essas configurações em uma única linha com o comando pen():

t.pen(pencolor="purple", fillcolor="pink", pensize=6, speed=2)
t.begin_fill()
t.circle(70)
t.end_fill()

Como resultado vamos obter a seguinte figura:

img

Esta única linha de código mudou toda a caneta, sem que precisemos alterar cada característica individualmente.

Pegando e Soltando a Caneta

Às vezes, podemos querer mover a turtle para outro ponto da tela sem desenhar nada na própria tela. Para esta tarefa podemos usar o comando penup(), se eventualmente quisermos voltar novamente a desenhar, podemos usar o comando pendown(), que irá fixar novamente a caneta à tela de desenho.

Vejamos um exemplo:

t.penup()
t.fd(50)
t.lt(90)
t.pendown()
t.bk(100)

Começamos levantando a caneta, em seguida nos movemos 50 unidades para frente (perceba que não teremos desenho, pois a caneta está levantada), depois alteramos a direção da turtle em 90 graus para a esquerda, finalmente colocamos a caneta de volta à tela e nos movemos 100 unidades para trás (dessa vez desenhando). Nosso resultado é:

img

Estes comandos podem ser muito úteis quando quisermos alternar entre não-desenhar e desenhar.

Desfazendo Alterações

Durante nossos desenhos é possível que cometamos algum erro, porém não há necessidade de preocupação, pois a biblioteca turtle nos fornece a opção de desfazer o que foi feito. Para isso devemos usar o seguinte comando:

t.undo()

Isso desfaz o último comando executado.

Limpando a Tela

No momento, provavelmente temos muitas coisas na tela desde que iniciamos este tutorial. Para abrir espaço para mais, podemos digitar o seguinte comando:

t.clear()

Isso limpará a tela para que possamos continuar a desenhar. Observe aqui que as variáveis não mudarão e a turtle permanecerá na mesma posição. Se tivermos outras turtles na tela além da turtle original, seus desenhos não serão apagados, a menos que indiquemos especificamente no código.

Resetando o Ambiente

Também temos a opção de começar do zero com um comando de redefinição. A tela será limpa e as configurações da turtle serão restauradas para seus parâmetros padrão. Tudo que precisamos fazer é digitar o seguinte comando:

t.reset()

Isso limpa a tela e leva a turtle de volta à sua posição inicial. As configurações padrão, como tamanho, forma, cor e outras características da turtle, também serão restauradas.

Deixando Marcas

Temos a opção de deixar uma marca da turtle na tela, que nada mais é do que uma “pegada” da tartaruga. Vejamos um exemplo:

t.stamp()
t.fd(70)
t.stamp()
t.left(90)
t.fd(70)

Nosso output será o seguinte:

img

Perceba que ao usarmos o comando stamp() nos é retornado um número, este número é chamado de stamp ID e podemos usá-lo para remover uma “pegada” da turtle, por exemplo:

t.clearstamp(13)

Este comando irá remover a marca ou “pegada” de ID = 13.

Exemplos de Artes

A seguir podemos ver alguns exemplos de artes, construídas com o poder da biblioteca turtle.

Flor

Código-fonte: flowerlife.py

Resultado:

img

Espiral

Código-fonte: spiral.py

Resultado:

img

Vortex

Código-fonte: vortex.py

Resultado:

img

Conclusão

Através deste tutorial fomos capazes de entender os fundamentos da biblioteca turtle, nos possibilitando assim, criar diversos desenhos com a linguagem Python.

Além disso, turtle pode ser muito útil para o ensino de programação!

Para mais detalhes, veja as referências usadas neste artigo.

Referências