🎯 Objetivos da Aula
Turtle
Biblioteca para desenhar
Formas
Círculos, quadrados, linhas
Cores
Colorir desenhos
Projeto
Arte generativa
📚 Conteúdo da Aula
🐢 Conhecendo a Tartaruga Mágica
O que é a Biblioteca Turtle?
A biblioteca Turtle é como ter uma tartaruga mágica que obedece aos nossos comandos para desenhar! É uma das formas mais divertidas de programar!
🤔 Por que se chama "Turtle"?
Imagine uma tartaruga com uma caneta amarrada na cauda! Conforme ela se move, desenha uma linha. Nós programamos para onde ela vai!
🌟 Por que Usar Turtle Graphics?
Vemos nosso código funcionando na tela
Aprender geometria brincando
Expressar criatividade através do código
Ver padrões e repetições em ação
📚 História Curiosa:
O Turtle Graphics foi criado em 1967 por Wally Feurzeig e Seymour Papert para ensinar programação para crianças! Eles queriam que aprender a programar fosse como brincar! 🎉
🎨 Comandos Básicos da Tartaruga
Aprendendo a Controlar Nossa Tartaruga
Vamos descobrir todos os comandos para fazer nossa tartaruga criar desenhos incríveis!
📋 Categorias de Comandos:
🚶 Movimento:
forward(100)
Anda para frente 100 passos
backward(50)
Anda para trás 50 passos
right(90)
Vira 90 graus à direita
left(45)
Vira 45 graus à esquerda
✏️ Desenho:
pendown()
Abaixa a caneta (começa a desenhar)
penup()
Levanta a caneta (para de desenhar)
circle(50)
Desenha um círculo com raio 50
dot(20)
Faz um ponto com tamanho 20
🎨 Cores e Estilo:
color("red")
Muda cor da caneta para vermelho
fillcolor("blue")
Define cor de preenchimento azul
pensize(5)
Muda espessura da linha para 5
speed(0)
Define velocidade (0 = máxima)
📍 Posição:
goto(100, 50)
Vai para posição x=100, y=50
home()
Volta para o centro (0, 0)
setheading(0)
Define direção para 0 graus (Norte)
xcor(), ycor()
Mostra posição atual x e y
🧪 Testando os Comandos Básicos:
# Importando a biblioteca turtle
import turtle
# Criando nossa tartaruga
artista = turtle.Turtle()
print("🐢 TESTANDO COMANDOS BÁSICOS 🐢")
# 1. MOVIMENTO SIMPLES
print("1. Desenhando quadrado...")
for i in range(4):
artista.forward(100) # Anda 100 passos
artista.right(90) # Vira 90 graus
# 2. MUDANDO CORES
print("2. Testando cores...")
cores = ["red", "blue", "green", "yellow", "purple"]
for cor in cores:
artista.color(cor)
artista.circle(20)
artista.penup()
artista.forward(50)
artista.pendown()
# 3. DIFERENTES ESPESSURAS
print("3. Diferentes espessuras...")
artista.home() # Volta ao centro
for espessura in range(1, 6):
artista.pensize(espessura)
artista.forward(100)
artista.backward(100)
artista.right(36) # 360/10 = 36 graus
# 4. FORMAS GEOMÉTRICAS
print("4. Formas geométricas...")
artista.home()
artista.pensize(3)
artista.color("orange")
# Triângulo
for i in range(3):
artista.forward(80)
artista.right(120)
# Ir para nova posição
artista.penup()
artista.goto(150, 0)
artista.pendown()
# Hexágono
artista.color("purple")
for i in range(6):
artista.forward(60)
artista.right(60)
print("✨ Teste completo!")
turtle.done() # Manter janela aberta
📐 Sistema de Coordenadas:
- Centro: (0, 0) - Meio da tela
- X positivo: Direita
- X negativo: Esquerda
- Y positivo: Cima
- Y negativo: Baixo
- Ângulos: 0° = Norte, 90° = Leste
💡 Dica Importante:
Sempre teste comandos pequenos primeiro! É como aprender a dirigir - comece devagar e depois acelere! 🚗💨
🔁 Padrões e Repetições
Criando Arte com Loops
A verdadeira magia acontece quando combinamos loops com turtle graphics! Vamos criar padrões hipnotizantes!
🎭 Tipos de Padrões:
⭐ Padrão Estrela
import turtle
artista = turtle.Turtle()
artista.speed(0)
artista.color("gold")
# Estrela de 8 pontas
for i in range(8):
artista.forward(100)
artista.backward(100)
artista.right(45)
turtle.done()
Desenha linhas do centro em todas as direções
🌸 Padrão Flor
import turtle
artista = turtle.Turtle()
artista.speed(0)
# Flor com 12 pétalas
for i in range(12):
artista.color("pink")
artista.circle(50)
artista.right(30)
turtle.done()
Círculos repetidos em ângulos diferentes
🌀 Padrão Espiral
import turtle
artista = turtle.Turtle()
artista.speed(0)
artista.color("blue")
# Espiral crescente
for i in range(100):
artista.forward(i)
artista.right(91)
turtle.done()
Movimento crescente com virada ligeiramente diferente
🌈 Padrão Arco-íris
import turtle
artista = turtle.Turtle()
artista.speed(0)
cores = ["red", "orange", "yellow", "green", "blue", "purple"]
# Arco-íris de círculos
for i, cor in enumerate(cores):
artista.color(cor)
artista.circle(100 - i * 10)
artista.penup()
artista.goto(0, -10 * (i + 1))
artista.pendown()
turtle.done()
Círculos concêntricos com cores diferentes
🚀 Padrões Avançados:
🎨 Arte Fractal Simples:
import turtle
import random
def arte_fractal():
"""Cria arte fractal colorida"""
tela = turtle.Screen()
tela.bgcolor("black")
tela.setup(800, 600)
artista = turtle.Turtle()
artista.speed(0)
artista.hideturtle() # Esconde a tartaruga
cores = ["#FF6B6B", "#4ECDC4", "#45B7D1", "#96CEB4", "#FFEAA7", "#DDA0DD"]
for i in range(200):
# Escolhe cor aleatória
artista.color(random.choice(cores))
# Tamanho baseado na iteração
tamanho = i * 2
# Desenha círculo
artista.circle(tamanho)
# Vira um ângulo interessante
artista.right(91)
# Muda posição ligeiramente
artista.forward(1)
turtle.done()
# Executar
arte_fractal()
🔥 Mandala Automática:
import turtle
import math
def criar_mandala():
"""Cria uma mandala matemática"""
tela = turtle.Screen()
tela.bgcolor("black")
artista = turtle.Turtle()
artista.speed(0)
artista.pensize(2)
# Parâmetros da mandala
num_circulos = 36
raio_base = 100
for i in range(num_circulos):
# Calcula cor baseada no ângulo
angulo = i * (360 / num_circulos)
# Cores que mudam gradualmente
red = int((math.sin(math.radians(angulo)) + 1) * 127.5)
green = int((math.sin(math.radians(angulo + 120)) + 1) * 127.5)
blue = int((math.sin(math.radians(angulo + 240)) + 1) * 127.5)
# Define cor em formato hexadecimal
cor = f"#{red:02x}{green:02x}{blue:02x}"
artista.color(cor)
# Desenha círculo
artista.circle(raio_base)
# Vira para próxima posição
artista.right(360 / num_circulos)
turtle.done()
# Executar
criar_mandala()
🎯 Dicas para Criar Padrões:
91°, 89°, 137° criam padrões interessantes
360 ÷ n = ângulo para n lados regulares
Círculos + linhas + cores = magia
speed(0) para ver resultado rápido
🎨 Projeto Principal - Arte Generativa Completa
🚀 Criando um Gerador de Arte Automático!
Vamos construir um programa que cria arte única toda vez que executamos! Cada obra será uma surpresa!
🌟 Recursos do Nosso Gerador:
Aleatoriedade
Cores, tamanhos e posições aleatórias
Múltiplos Estilos
Geometric, orgânico, abstrato
Salvar Obras
Guardar arte em arquivo
Configurável
Usuário escolhe parâmetros
🎮 Código Completo - Gerador de Arte:
# 🎨 GERADOR DE ARTE GENERATIVA COMPLETO 🎨
import turtle
import random
import math
import time
class GeradorArte:
"""Classe para gerar arte automática com turtle"""
def __init__(self):
self.tela = turtle.Screen()
self.artista = turtle.Turtle()
self.configurar_ambiente()
def configurar_ambiente(self):
"""Configura a tela e tartaruga"""
self.tela.bgcolor("black")
self.tela.setup(900, 700)
self.tela.title("🎨 Gerador de Arte Generativa")
self.artista.speed(0)
self.artista.hideturtle()
self.artista.pensize(2)
def paleta_cores_aleatoria(self):
"""Gera uma paleta de cores harmoniosas"""
paletas = [
# Paleta Tropical
["#FF6B6B", "#4ECDC4", "#45B7D1", "#96CEB4", "#FFEAA7"],
# Paleta Noturna
["#2D3436", "#74B9FF", "#A29BFE", "#FD79A8", "#FDCB6E"],
# Paleta Outono
["#E17055", "#FDCB6E", "#E84393", "#00B894", "#00CEC9"],
# Paleta Primavera
["#FF7675", "#74B9FF", "#55A3FF", "#00B894", "#FDCB6E"],
# Paleta Sunset
["#FD79A8", "#FDCB6E", "#E17055", "#74B9FF", "#A29BFE"]
]
return random.choice(paletas)
def arte_geometrica(self, complexidade=50):
"""Cria arte geométrica com formas regulares"""
print("🔹 Gerando arte geométrica...")
cores = self.paleta_cores_aleatoria()
# Limpar tela
self.artista.clear()
for i in range(complexidade):
# Escolher cor
self.artista.color(random.choice(cores))
# Posição aleatória
x = random.randint(-400, 400)
y = random.randint(-300, 300)
self.artista.penup()
self.artista.goto(x, y)
self.artista.pendown()
# Escolher forma
forma = random.choice(['circulo', 'quadrado', 'triangulo', 'hexagono'])
tamanho = random.randint(10, 80)
if forma == 'circulo':
self.artista.circle(tamanho)
elif forma == 'quadrado':
for _ in range(4):
self.artista.forward(tamanho)
self.artista.right(90)
elif forma == 'triangulo':
for _ in range(3):
self.artista.forward(tamanho)
self.artista.right(120)
elif forma == 'hexagono':
for _ in range(6):
self.artista.forward(tamanho // 2)
self.artista.right(60)
def arte_organica(self, complexidade=100):
"""Cria arte orgânica com curvas e espirais"""
print("🌿 Gerando arte orgânica...")
cores = self.paleta_cores_aleatoria()
self.artista.clear()
for i in range(complexidade):
self.artista.color(random.choice(cores))
# Movimento orgânico
self.artista.forward(random.randint(5, 50))
self.artista.right(random.randint(-45, 45))
# Ocasionalmente fazer curvas
if random.random() < 0.3:
raio = random.randint(10, 50)
angulo = random.randint(90, 270)
self.artista.circle(raio, angulo)
# Ocasionalmente pular para nova posição
if random.random() < 0.1:
self.artista.penup()
x = random.randint(-400, 400)
y = random.randint(-300, 300)
self.artista.goto(x, y)
self.artista.pendown()
def arte_fractal(self, profundidade=5):
"""Cria arte fractal com padrões recursivos"""
print("🌀 Gerando arte fractal...")
cores = self.paleta_cores_aleatoria()
self.artista.clear()
def desenhar_galho(tamanho, profundidade):
"""Desenha galho fractal recursivamente"""
if profundidade == 0:
return
# Desenha linha principal
self.artista.forward(tamanho)
# Salva posição
pos = self.artista.position()
angulo = self.artista.heading()
# Galho esquerdo
self.artista.left(30)
self.artista.color(random.choice(cores))
desenhar_galho(tamanho * 0.7, profundidade - 1)
# Volta à posição
self.artista.penup()
self.artista.goto(pos)
self.artista.setheading(angulo)
self.artista.pendown()
# Galho direito
self.artista.right(30)
self.artista.color(random.choice(cores))
desenhar_galho(tamanho * 0.7, profundidade - 1)
# Posicionar na base
self.artista.penup()
self.artista.goto(0, -300)
self.artista.setheading(90)
self.artista.pendown()
# Começar fractal
self.artista.color(random.choice(cores))
desenhar_galho(100, profundidade)
def arte_mandala(self, detalhes=20):
"""Cria mandala matemática"""
print("🕌 Gerando mandala...")
cores = self.paleta_cores_aleatoria()
self.artista.clear()
self.artista.goto(0, 0)
for camada in range(3):
raio_base = 50 + camada * 40
for i in range(detalhes):
angulo = i * (360 / detalhes)
# Cor gradual baseada no ângulo
cor_index = int((i / detalhes) * len(cores))
self.artista.color(cores[cor_index])
# Desenha pétala
self.artista.circle(raio_base, 60)
self.artista.left(120)
self.artista.circle(raio_base, 60)
# Próxima posição
self.artista.left(360 / detalhes - 120)
def menu_principal(self):
"""Menu interativo para escolher tipo de arte"""
while True:
print("\n" + "🎨" * 30)
print(" 🎭 GERADOR DE ARTE GENERATIVA 🎭")
print("🎨" * 30)
print("\n📋 ESTILOS DISPONÍVEIS:")
print("1. 🔹 Arte Geométrica")
print("2. 🌿 Arte Orgânica")
print("3. 🌀 Arte Fractal")
print("4. 🕌 Arte Mandala")
print("5. 🎲 Surpresa (aleatório)")
print("6. 🎬 Show Automático (todos os estilos)")
print("7. 💾 Salvar Arte Atual")
print("8. 🚪 Sair")
try:
escolha = int(input("\n🎯 Escolha um estilo (1-8): "))
if escolha == 1:
complexidade = int(input("🔢 Complexidade (20-100): "))
self.arte_geometrica(complexidade)
elif escolha == 2:
complexidade = int(input("🔢 Complexidade (50-200): "))
self.arte_organica(complexidade)
elif escolha == 3:
profundidade = int(input("🔢 Profundidade (3-7): "))
self.arte_fractal(profundidade)
elif escolha == 4:
detalhes = int(input("🔢 Detalhes (10-30): "))
self.arte_mandala(detalhes)
elif escolha == 5:
print("🎲 Surpresa! Gerando arte aleatória...")
estilo = random.choice([1, 2, 3, 4])
if estilo == 1:
self.arte_geometrica(random.randint(30, 80))
elif estilo == 2:
self.arte_organica(random.randint(80, 150))
elif estilo == 3:
self.arte_fractal(random.randint(4, 6))
else:
self.arte_mandala(random.randint(15, 25))
elif escolha == 6:
print("🎬 Iniciando show automático...")
estilos = [
(self.arte_geometrica, [50]),
(self.arte_organica, [100]),
(self.arte_fractal, [5]),
(self.arte_mandala, [20])
]
for i, (func, args) in enumerate(estilos):
print(f"🎭 Exibindo estilo {i+1}/4...")
func(*args)
time.sleep(3)
elif escolha == 7:
nome = input("💾 Nome do arquivo (sem .ps): ")
try:
self.tela.getcanvas().postscript(file=f"{nome}.ps")
print(f"✅ Arte salva como {nome}.ps")
except:
print("❌ Erro ao salvar arquivo")
elif escolha == 8:
print("👋 Obrigado por usar o Gerador de Arte!")
break
else:
print("❌ Opção inválida! Escolha 1-8.")
except ValueError:
print("❌ Digite apenas números!")
except Exception as e:
print(f"❌ Erro: {e}")
def iniciar(self):
"""Inicia o gerador de arte"""
print("🎊 Bem-vindo ao Gerador de Arte Generativa!")
print("✨ Cada execução cria uma obra única!")
self.menu_principal()
turtle.done()
# Executar o programa
if __name__ == "__main__":
gerador = GeradorArte()
gerador.iniciar()
🚀 Extensões Possíveis:
🎵 Arte Musical
Sincronizar desenhos com música
📱 Interface Gráfica
Botões para controlar em tempo real
🌐 Arte Interativa
Responder a cliques do mouse
🎨 Mais Estilos
Pixel art, arte ASCII, 3D
💡 Conceitos Aplicados:
- Classes e Objetos: Organização orientada a objetos
- Métodos: Funções dentro de classes
- Recursão: Funções que chamam a si mesmas
- Aleatoriedade: Arte generativa única
- Matemática: Ângulos, coordenadas, proporções
🏠 Desafios para Casa
🏠 Desafio Principal: Desenhe Sua Casa dos Sonhos
Use todos os comandos Turtle para criar a casa dos seus sonhos! Seja criativo!
🏗️ Elementos Obrigatórios:
- 🏠 Estrutura básica (paredes, teto)
- 🚪 Porta de entrada
- 🪟 Pelo menos 3 janelas
- 🌳 Árvore ou jardim
- ☀️ Sol ou nuvens no céu
- 🌈 Pelo menos 5 cores diferentes
- 🎨 Um elemento surpresa criativo
🏗️ Estrutura Base da Casa:
import turtle
import random
def desenhar_casa():
"""Desenha uma casa completa"""
# Configuração inicial
tela = turtle.Screen()
tela.bgcolor("lightblue") # Céu azul
tela.setup(900, 700)
arquiteto = turtle.Turtle()
arquiteto.speed(5)
arquiteto.pensize(3)
# 1. ESTRUTURA PRINCIPAL
def desenhar_paredes():
"""Desenha as paredes da casa"""
arquiteto.color("brown")
arquiteto.fillcolor("beige")
arquiteto.begin_fill()
# Quadrado para a casa
for _ in range(4):
arquiteto.forward(200)
arquiteto.left(90)
arquiteto.end_fill()
def desenhar_teto():
"""Desenha o teto triangular"""
arquiteto.color("red")
arquiteto.fillcolor("darkred")
arquiteto.begin_fill()
# Triângulo para o teto
for _ in range(3):
arquiteto.forward(200)
arquiteto.left(120)
arquiteto.end_fill()
def desenhar_porta():
"""Desenha a porta"""
# Posicionar para a porta
arquiteto.penup()
arquiteto.goto(50, 0)
arquiteto.pendown()
arquiteto.color("brown")
arquiteto.fillcolor("darkbrown")
arquiteto.begin_fill()
# Retângulo da porta
arquiteto.left(90)
arquiteto.forward(80)
arquiteto.right(90)
arquiteto.forward(40)
arquiteto.right(90)
arquiteto.forward(80)
arquiteto.right(90)
arquiteto.forward(40)
arquiteto.end_fill()
# Maçaneta
arquiteto.penup()
arquiteto.goto(80, 40)
arquiteto.pendown()
arquiteto.color("gold")
arquiteto.dot(8)
def desenhar_janelas():
"""Desenha as janelas"""
posicoes_janelas = [(20, 120), (120, 120), (160, 120)]
for x, y in posicoes_janelas:
arquiteto.penup()
arquiteto.goto(x, y)
arquiteto.pendown()
# Janela
arquiteto.color("blue")
arquiteto.fillcolor("lightblue")
arquiteto.begin_fill()
for _ in range(4):
arquiteto.forward(30)
arquiteto.left(90)
arquiteto.end_fill()
# Cruz da janela
arquiteto.color("black")
arquiteto.penup()
arquiteto.goto(x + 15, y)
arquiteto.pendown()
arquiteto.left(90)
arquiteto.forward(30)
arquiteto.penup()
arquiteto.goto(x, y + 15)
arquiteto.pendown()
arquiteto.right(90)
arquiteto.forward(30)
# Sua implementação aqui...
# Complete com: árvore, sol, jardim, etc.
turtle.done()
# Executar
desenhar_casa()
🎯 Desafios Bônus:
Desenhar um carro que se move pela tela
Gerar flores aleatórias em posições diferentes
Animação de explosões coloridas
Mostrar hora atual com ponteiros
Cobrinha controlada por teclas
Planetas orbitando o sol
🎓 O que Você Vai Aprender:
🖼️ Galeria de Inspiração:
🎨 Artistas Famosos que Usaram Geometria:
- Piet Mondrian: Linhas retas e cores primárias
- Wassily Kandinsky: Formas geométricas abstratas
- M.C. Escher: Padrões matemáticos impossíveis
- Sol LeWitt: Arte conceitual com instruções
🌟 Sua arte pode ser a próxima obra-prima digital!