Turtle
Introduction
La tortue graphique (ou Turtle) est un module d'initiation à la programmation. Son fonctionnement consiste à réaliser des dessins par le déplacement d'une tortue virtuelle dotée d'un stylo sur un plan orthonormé.
| Fonction | Synonyme | Description |
|---|---|---|
forward(n) | fd(n) | Avancer la tortue de n pixel |
backward(n) | bk(n) | Reculer la tortue de n pixel |
left(n) | rt(n) | Effectuer une rotation de la tortue d'un angle de n degrés vers la gauche (sans antihoraire) |
right(n) | lt(n) | Effectuer une rotation de la tortue d'un angle de n degrés vers la droite (sans horaire) |
goto(x, y) | Déplacer la tortue aux coordonnées (x, y) | |
penup() | pu() | Lever le crayon |
pendown() | pd() | Baisser le crayon |
Vous pouvez consulter la documentation de ces fonctions et en découvrir bien d'autres sur le site officiel de Python : https://docs.python.org/fr/3/library/turtle.html
Préparation
Arborescence
Avant de commencer, vous allez mettre à jour (ou créer) le dossier de travail dédié à la spécialité NSI. Nous partagerons ainsi une même arborescence simplifiant ainsi la recherche de tout fichier.
Ordinateurs du lycée
Si vous travaillez sur les ordinateurs du lycée, votre dossier de travail doit être placé dans votre zone personnelle. Celle-ci est accessible de plusieurs manières :
- Directement depuis le bureau en cliquant sur l'icône intitulée Zone personnelle
- Depuis l'Exportateur Windows en allant dans Bureau puis Zone personnelle
- Depuis l'Explorateur Windows en allant dans le lecteur réseau
P:
Ordinateur de la région
Si vous travaillez sur l'ordinateur portable de la région, vous êtes libre de choisir l'emplacement de votre répertoire de travail.
Création ou mise à jour de l'espace de travail
- Créer le dossier
NSIs'il n'existe pas déjà - Dans le dossier
NSI, créer le dossierchapitre_03 - Déplacer dans le dossier
chapitre_03les fichiers du TP2 - Si besoin, renommer le dossier
htmlcréé dans le cadre du TP HTML/CSS enchapitre_02
Logiciel
Vous devez disposer d'un interpréteur Python sur votre machine. Nous recommandons fortement l'utilisation de l'application Thonny avec lequel ces travaux pratiques ont été conçus et testés.
Exercice 1 - Premiers déplacements
Vérifier le bon fonctionnement du module Turtle. Pour cela :
- Lancer l'application Thonny
- Créer un nouveau fichier et y copier/coller le code ci-après
- Enregistrer le fichier dans le répertoire
chapitre_03en le nommanttp3_turtle.py - Lancer l'exécution du programme
import turtle
# Tracé de démonstration
turtle.goto(40, 40)
turtle.right(90)
turtle.forward(40)
turtle.left(90)
turtle.penup()
turtle.backward(20)
turtle.pendown()
turtle.backward(20)
# Boucle des événements
# Nécessaire pour voir capter mes interactions avec le souris ou le clavier
# Nécessaire aussi pour l'affichage sous Basthon ou éviter de bloquer EduPython
# turtle.mainloop()
Pouvez-vous décrire le rôle de chaque instruction du tracé ?
Pouvez-vous situer l'origine (point de coordonnées (0,0)) du plan orthonormé au sein de la fenêtre Turtle ?
En l'absence de l'appel de la fonction turtle.mainloop(), la console Python reste accessible sous Thonny.
À l'exécution de votre programme, vous pouvez alors y saisir d'autres instructions Turtle et voir directement le résultat à l'écran.
Tester par exemple turtle.goto(-100, 100)
Exercice 2 - Aide au tracé
Affichage d'une grille
Afin d'éventuellement mieux visualiser la position de la tortue dans le plan, nous avons écrit une fonction capable d'afficher une grille à l'écran. Suivre les instructions suivantes pour pouvoir l'afficher.
- Créer un nouveau fichier
- Y copier/coller le code ci-après
- Enregistrer le fichier dans le répertoire
chapitre_03en le nommantaide.py
import turtle as t
def jump_to(x, y):
t.penup()
t.goto(x, y)
t.pendown()
def draw_custom_grid(width, height, step, color):
top_left_x = -width//2
top_left_y = height//2
t.pencolor(color)
t.tracer(False)
i = 0
while i <= height//step:
jump_to(top_left_x, top_left_y-step*i)
t.forward(width)
i += 1
t.right(90)
j = 0
while j <= width//step:
jump_to(top_left_x+step*j, top_left_y)
t.forward(height)
j += 1
t.penup()
t.home()
t.pencolor("black")
t.pendown()
t.tracer(True)
def grille(width=800, height=800):
draw_custom_grid(width, height, 10, '#e0e0e0')
draw_custom_grid(width, height, 100, '#cccccc')
Afficher la grille
Retourner au fichier tp_turtle.py. Ajouter le code nécessaire pour importer le module aide, qui correspond au fichier aide.py créé précédemment, puis appeler la fonction grille() de ce module.
import turtle
import aide
# Tracé de la grille
aide.grille()
# Tracé de démonstration
...
Savez-vous expliquer précisément ce que fait l'instruction import aide ?
Afficher la grille n'a rien d'indispensable, elle peut cependant vous aider à vous repérer en phase de débogage.
Exercice 3 - Formes géométriques
Tracer un carré
Nous souhaitons tracer un carré. Suivre les instructions suivantes :
- Ouvrir le fichier
tp3_turtle.py - Supprimer le code du tracé de démonstration
- Élaborer un algorithme permettant de tracer un carré en ne faisant qu'avancer ou tourner la tortue
- Écrire le code qui permettrait de tracer un carré de 100 pixels de côté
Tracer un triangle équilatéral
Nous souhaitons tracer un triangle équilatéral à l'écran. Suivre les instructions suivantes :
- Créer un nouveau fichier et l'enregistrer immédiatement en le nommant
tp3_triangle.py - Trouver un algorithme permettant de tracer un triangle équilatéral en ne faisant qu'avancer ou tourner la tortue
- Écrire le code qui permettrait de tracer un triangle équilatéral de 100 pixels de côté
Exercice 4 - Utilisation des boucles
Si vous n'avez pas pensé utiliser une boucle, vous devriez constater une répétition de certaines commandes. Exemple pour le tracé d'un carré :
# Tracé d'un carré
turtle.forward(100)
turtle.right(90)
turtle.forward(100)
turtle.right(90)
turtle.forward(100)
turtle.right(90)
turtle.forward(100)
turtle.right(90)
Pour éviter ces répétitions, vous pouvez utiliser une boucle qui se chargera de répéter les commandes dédiées au tracé d'un seul côté du carré.
# Tracé d'un carré
i = 0
while i < 4:
turtle.forward(100)
turtle.right(90)
i = i + 1
- Ouvrir le script
tp3_turtle.py - Remplacer l'ancienne implémentation du tracé d'un carré par celle faisant usage d'une boucle
- Vérifier son bon fonctionnement
- Modifier le fichier
tp3_triangle.pyde façon à ce que le tracé du triangle équilatéral se fasse aussi à l'aide d'une boucle
Exercice 5 - Utilisation des fonctions et des modules
Tracé de plusieurs carrés
Nous souhaiterions effectuer le tracé de plusieurs carrés à l'écran.
- Ouvrir le script
tp3_turtle.py - Modifier le code de façon à tracer trois carrés distincts à l'écran (copier/coller de code autorisé)
Si vous souhaitez démarrer un tracé à un autre endroit du plan que l'origine, pensez à déplacer au préalable la tortue en levant son crayon.
Vous pouvez aussi réinitialiser la position et l'angle de la tortue en utilisant la fonction turtle.home().
Factorisation du code
Vous avez probablement dupliqué le code du carré initial. Dupliquer du code n'est pas une bonne pratique de programmation. Nous pouvons éviter cela grâce à une fonction, c'est-à-dire un bloc de code nommé et réutilisable qui ne s'exécute que si on l'appelle. L'action consistant à mutualiser du code dupliqué au sein d'une fonction s'appelle factoriser.
import turtle
def carre():
"""Dessine un carré de 100 pixels de côté"""
i = 0
while i < 4:
turtle.forward(100)
turtle.right(90)
i = i + 1
- Ouvrir le fichier
tp3_turtle.py - Copier/coller le code ci-dessus en début de fichier (une fonction doit être définie avant son utilisation)
- Modifier votre code du tracé des trois carrés en faisant cette fois appel à la fonction
carre()
Savez-vous expliquer ce qu'est factoriser du code ?
Création d'un module
- Créer un nouveau fichier et l'enregistrer immédiatement dans un fichier nommé
formes.py - Importer le module
turtle - Déplacer le code de la fonction
carre()du fichiertp3_turtle.pyvers le fichier formes.py - Modifier le fichier
tp3_turtle.pyde façon à importer le moduleformeset appeler la fonction de tracé des carrés depuis ce moduleformes.carre()
Fichier formes.py
import turtle
def carre():
"""Dessine un carré de 100 pixels de côté"""
i = 0
while i < 4:
turtle.forward(100)
turtle.right(90)
i = i + 1
Exemple de fichier tp3_turtle.py
import turtle
import formes
turtle.pu()
turtle.goto(-150, 150)
turtle.pd()
formes.carre()
turtle.pu()
turtle.goto(150, 150)
turtle.pd()
formes.carre()
turtle.pu()
turtle.goto(150, -150)
turtle.pd()
formes.carre()
Êtes-vous capable de repérer une autre portion de code potentiellement factorisable dans l'exemple de fichier tp3_turtle.py ci-dessus ?
Fonction de tracé d'un triangle équilatéral
- Ouvrir le fichier
formes.py - De la même manière que pour le carré, créer la fonction
triangle() - Tester cette fonction dans le fichier
tp3_triangle.pyen dessinant 3 triangles
Exercice 6 - Utilisation des paramètres
Nous souhaitons maintenant pouvoir dessiner des formes géométriques de différentes tailles.
Pour ce faire, nous allons rendre l'algorithme de tracé d'un carré paramétrable en ajoutant un paramètre à la fonction carre().
def carre(longueur):
'''Dessine un carré de "longueur" pixels de côté'''
i = 0
while i < 4:
turtle.forward(longueur)
turtle.right(90)
i = i + 1
- Modifier la fonction
carre()définie dans le fichierformes.py - Modifier le fichier
tp3_turtle.pyde façon à tracer trois carrés : un de 20 pixels, un autre de 100 pixels et un dernier de 200 pixels - Faire de même avec la fonction
triangle()et tracer trois triangles de taille différente dans le fichiertp3_triangle.py
Exercice 7 - Polygones
Le carré et le triangle équilatéral sont des polygones réguliers. Un polygone régulier est un polygone dont les côtés et les angles intérieurs ont la même mesure.
- Ouvrir le fichier
formes.py - Écrire la fonction
polygone()permettant de tracer un polygone régulier à partir de son nombre de côtés et leur longueur. Vous trouverez ci-après le code à trou permettant de réaliser cette fonction. - Tester cette fonction dans le fichier
tp3_turtle.py - Modifier les fonctions
carre()ettrianglede manière à ce qu'elle fasse appel à la fonctionpolygone()pour le tracé
def polygone(n, longueur):
'''Dessine un polygone régulier de "n" côtés de "longueur" pixels'''
i = 0
while i < ...:
turtle.forward(...)
turtle.right(...)
i = i + 1
⚠️ Rendu des travaux pratiques
Avant d'aller plus loin, le travail effectué jusqu'à présent doit être rendu. Pour ce faire :
- Se connecter à l'ENT
- Accéder à l'application Exercice
- Trouver le formulaire TP 3.3 Turtle - Premier rendu
- Déposer les fichiers
tp3_turtle.py,tp3_triangle.pyetformes.py - Se connecter à Pronote
- Répondre au questionnaire d'évaluation
Exercice 8 - Dessin
Générer des dessins
Nous souhaitons maintenant effectuer des tracés plus ambitieux :
- Ajouter le code des fonctions
dessin_1()etdessin_2()ci-après au fichierformes.py - Tester ces fonctions dans le fichier
tp3_turtle.py
def dessin_1(n, longueur):
'''Dessine une combinaison de "n" carrés de taille "longueur"'''
while n > 0:
carre(longueur)
turtle.right(10)
n = n - 1
def dessin_2(n, longueur):
'''Dessine une série de "n" carrés de taille "longueur"'''
while n > 0:
carre(longueur)
turtle.pu()
turtle.forward(2*longueur)
turtle.pd()
turtle.right(10)
n = n - 1
Vous pouvez modifier la vitesse de déplacement de la tortue grâce à la fonction turtle.speed()
Reproduire un dessin
Essayer de produire un dessin se rapprochant de la capture d'écran suivante :
