Le module Turtle
Nicolas Perpète
Dans ce TP, nous apprenons à utiliser le module Turtle de Python, qui permet de faire des petits dessins comme sur l’image ci-dessus. Une fois le module pris en main, l’étude desboucles Pour nous permet d’aller un peu plus vite pour construire certains motifs répétitifs. Ce travail est l’occasion de revoir plusieurs notions déjà étudiées en début d’année, comme les fonctions.
Ce TP est prévu pour quatre semaines (donc 4h à la maison et 2h en classe, ou l’inverse). Chacun d’entre vous devrait arriver à la fin de la section 4 au moins au terme des quatre semaines. Les élèves les plus à l’aise pourront traiter les sections 5 et 6.
Pensez à enregistrer votre travail régulièrement sur votre session au lycée, ou sur une clé USB à la maison. Ramenez cette clé USB en classe pour ne pas avoir à tout recommencer à chaque fois1.
1 Installer Thonny
Dans cette section, on explique comment installer Thonny sur un PC. Les élèves en classe peuvent passer cette section et aller directement à la section 2. Si vous n’avez pas de PC chez vous, il faut avancer dans le TP sur un PC du lycée la semaine où vous venez2.
Thonny (logiciel pour Python) est un logiciel gratuit. Pour l’installer sur votre PC, allez sur le site de Thonny.
Choisir le système d’exploitation de votre PC, enregistrer le fichier proposé, puis l’exécuter.
Comme expliqué (en anglais) sur l’image ci-dessous, si vous êtes sous Windows, il va râler. Cliquer alors sur « Informations complémentaires » (= More info) puis sur « Exécuter quand même » (=
Run anyway).
1. Cela me permettra également de vérifier que vous avez travaillé à la maison.
2. Il est peut-être possible de trouver des applications pour smartphones qui permettent de travailler efficacement en Python, sans utiliser Thonny, mais je n’ai rien trouvé qui m’ait convenu.
2 Premiers dessins en Turtle
Lancer le logiciel Thonny.
L’écran est coupé en deux, la partie haute s’appelle l’éditeur de code, la partie basse s’appelle le Shell.
Dans l’éditeur de code, entrer l’instruction from turtle import *
On vient de charger le module Turtle.
Sauvegarder votre travail avec la commande File/Save as..., puis choisir le nom de fichierfigure1.
Toujours dans l’éditeur de code, entrer l’instruction reset( )
puis valider avec . Une fenêtrePython Turtle Graphics s’ouvre3, entièrement vide.
Compléter l’éditeur pour avoir le code ci-dessous, puis valider avec . from turtle import *
reset( ) speed(1) forward(50) left(90) forward(100)
Turtle a construit deux segments perpendiculaires. Commentons le code ligne par ligne :
• reset( ) efface l’écran et place le crayon au centre ;
• speed(1) permet de réduire la vitesse du crayon (les vitesses possibles vont de 1 à 10) ;
• forward(100) avance de 100 pixels (au départ, on avance vers la droite) ;
• left(90) tourne de 90◦vers la gauche ;
• forward(200) avance de 200 pixels.
Modifier le code pour obtenir chacune des deux figures ci-dessous, chaque segment ayant pour longueur 100 pixels. Enregistrer le code pour obtenir la figure de gauche dans le fichierfigure1, et celui pour obtenir la figure de droite dans un nouveau fichierfigure2.
3. Si ce n’est pas le cas, c’est qu’elle est cachée derrière d’autres fenêtres. Le cas échéant, réduisez la taille de ces autres fenêtres.
Le tableau ci-dessous recense les instructions essentielles du module Turtle :
Instructions Descriptions
speed(nombre) modifie la vitesse du crayon (nombre peut aller de 1 à 10)
up( ) soulève le crayon
down( ) rabaisse le crayon
forward(distance) avance d’une distance donnée (en pixels) left(angle) tourne d’un angle donné (en degrés) vers la gauche right(angle) tourne d’un angle donné (en degrés) vers la droite pencolor("couleur") change la couleur du crayon (couleur à écrire en anglais)
width(nombre) modifie l’épaisseur du trait (nombre peut aller de 1 à 10) clear( ) efface l’écran sans modifier la position du crayon reset( ) efface l’écran et place le crayon au point de départ
hideturtle( ) masque le crayon
Modifier le fichier figure2 comme ci-dessous. Vous obtenez un triangle équilatéral tricolore de côté 200.
from turtle import * reset( )
speed(1) pencolor("red") forward(200) left(120)
pencolor("blue") forward(200) left(120)
pencolor("green") forward(200) hideturtle( )
Astuce : Copier le code à gauche et, dans Thonny, choisir Edit/Paste pour le coller.
Il est possible de lever, puis de rabaisser le crayon pour faire plusieurs dessins côte à côte. On utilise l’instruction up( ) pour lever le crayon, et down( ) pour le rabaisser. Lorsque le crayon est
« en l’air », il n’écrit pas !
En utilisant up( ) et down( ), réaliser la figure ci-dessous, que vous enregistrerez dans le fichier figure3. Les segments font 50 pixels de large et sont espacés de 50 pixels.
Les dessins sont réalisés dans un repère orthonormé gradué de −200 à 200en abscisse et en ordonnée.
−100 100
−200
−100
−200 100
Ce repère est invisible sur la fenêtre de dessin, mais Turtle l’utilise pour se repérer. L’instruction goto(x,y)
permet de se rendre au point de coordonnées (x,y). Essayer par exemple de recopier ligne par ligne les instructions suivantes dans le Shell4 :
>>>from turtle import *
>>>reset( )
>>>goto(100,40)
>>>goto(60,-20)
>>>goto(0,0)
Vous obtenez la figure ci-contre – mais sans le repère !
On notera qu’au départ le stylo est au point de coordonnées(0,0).
20 40 60 80 100
−20 20 40
Pour conclure cette première section, on vous demande de dessiner la maison ci-dessous. Le toit fait un angle de 60◦avec l’horizontale et tous les segments mesurent 100 pixels (fichierfigure4).
3 Turtle et les boucles Pour
Dans le paragraphe précédent, on a dessiné la figure formée de trois segments espacés :
Pour faire le dessin plus rapidement, on voudrait pouvoir coder en Python l’algorithme écrit en français ci-dessous :
Algorithme en français Répéter trois fois :
dessiner un segment de longueur 50 pixels lever le crayon
avancer de 50 pixels baisser le crayon
4. Ne rajoutez pas les chevrons>>>à ceux déjà écrits !
Cet algorithme est ce que l’on appelle une boucle : on répète trois fois la même instruction. Il existe une méthode spéciale pour coder ce type de boucle en Python : l’instructionPour5. Voici le code :
from turtle import * for k in range(1,4) :
forward(50) up( ) forward(50) down( )
Entrez ce code dans l’éditeur et lancez-le en enregistrant votre travail dans le fichier figure5.
N’oubliez pas les « : » à la fin de la ligne 2 ; un incrément est alors automatiquement créé au début de la ligne 3 – cet incrément est indispensable !
La deuxième ligne du code se lit « pour k allant de 1 à 3 »6. La variable k prend donc successi- vement les valeurs 1, 2 et 3.
• Quand k vaut 1, on effectue une première fois les instructions : forward(50)
up( ) forward(50) down( )
• Quand k vaut 2, on effectue une deuxième fois les instructions : forward(50)
up( ) forward(50) down( )
• Quand k vaut 3, on effectue une troisième fois les instructions : forward(50)
up( ) forward(50) down( )
On notera que la lettre k dans la première ligne sert seulement à dire qu’il faut faire trois fois de suite la même chose. On pourrait d’ailleurs la remplacer par n’importe quelle autre lettre de l’alphabet.
On voudrait maintenant dessiner l’escalier à 10 marches ci-dessous :
5. Pour (français) = For (anglais).
6. Oui, je ne me suis pas trompé, de 1 à 3, parce qu’il y a un décalage dans la borne de droite : le range(1,4) signifie qu’il faut aller jusqu’à3seulement. Il y aura toujours ce décalage en Python ; c’est un peu pénible, mais on s’y habitue.
Pour vous aider, on a écrit une petite partie du code. On vous demande de le recopier dans l’éditeur en complétant les pointillés :
from turtle import * for k in range(1,. . .) :
forward(20) left(90) . . . . . . . .
Enregistrer le travail dans le fichierfigure5 (déjà créé) et valider avec .
Essayer maintenant de construire un carré de côté 100 pixels en complétant le code ci-dessous (à enregistrer dans le fichierfigure6) :
from turtle import * for k in range(1,5) :
. . . . . . . .
À présent construire un octogone régulier d’arête 70 pixels (toujours le fichierfigure6) :
Puis exécuter le code suivant (fichierfigure7) : from turtle import *
for k in range(1,6) : forward(200) left(144)
Modifier le code qui précède pour construire une étoile à 9 branches (on pourra s’aider du codage à droite) :
20◦
4 Des fonctions en Turtle
Dans cette section, on réinvestit nos connaissances sur les fonctions pour faire des dessins avec Turtle.
On définit une fonctioncarre dans l’éditeur de code (fichier figure8) : from turtle import *
def carre( ) :
for k in range(1,5) : forward(50) left(90)
Valider avec puis, dans le Shell, entrer la commande :
>>>carre( )
Modifier le fichierfigure8 comme ci-dessous : from turtle import *
def carre( ) :
for k in range(1,5) : forward(50) left(90) for j in range(1,7) :
carre( ) forward(50)
Valider avec , puis modifier une nouvelle fois le fichierfigure87 pour obtenir la figure :
7. Il suffit de modifier deux nombres et d’ajouter deux lignes dans la boucle à la fin – ne modifiez pas la fonction carre!
On écrit à présent une fonction qui dessine un escalier denmarches, chacune ayant pour largeur 30 et pour hauteur 30 (fichierfigure9) :
from turtle import * def escalier(n) :
for k in range(1,n+1) : forward(30) left(90) forward(30) right(90) escalier(6)
En compilant, on obtient un escalier à 6 marches.
Modifier le fichierfigure9 et écrire une fonctiondent_de_sciede telle sorte quedent_de_scie(n) construise une dent de scie àndents. Par exemple, l’instruction
>>>dent_de_scie(3)
donne le résultat :
Pour vous aider, on a écrit le début du code : from turtle import *
def dent_de_scie(n) : left(45)
for. . . : . . . . . . . . . . . . . . . .
En nous inspirant des exemples précédents, on voudrait écrire une fonction qui construit un polygone régulier àncôtés,npouvant prendre n’importe quelle valeur. Avant cela, rappelons qu’on a vu dans la section 2 que pour construire :
• un triangle équilatéral, il fallait tourner trois fois de120◦= 3603◦ ;
• un carré, il fallait tourner quatre fois de90◦=3604◦ ;
• un octogone régulier, il fallait tourner huit fois de45◦= 3608◦.
Éditer une fonctionpolygone telle quepolygone(n) trace un polygone régulier de côté 50 (dans le fichierfigure9 déjà créé). Voici ce que vous devez obtenir :
>>>polygone(5) >>>polygone(6) >>>polygone(10)
5 Quelques compléments
À partir de maintenant, on laisse le lecteur gérer les noms de fichiers à son idée. On donne quelques compléments sur les bouclesPour et sur le module Turtle.
Essayer le code suivant : from turtle import * longueur = 5 for k in range(40) :
forward(longueur) left(90)
longueur = longueur + 5
Essayer à présent de construire la figure ci-dessous (avec un code de dix lignes maximum) :
Voici deux nouvelles instructions du module Turtle :
Instructions Descriptions
fillcolor("couleur") permet de remplir un contour fermé en couleur⋆ circle(x,360) construit un cercle de rayon x
⋆ begin_fill() doit être indiqué avant le tracé du contour fermé, end_fill après le tracé.
Essayer par exemple le code suivant :
from turtle import * begin_fill( )
fillcolor("blue") for k in range(4) :
forward(100) left(90) end_fill( ) up( ) goto(50,30) down( ) begin_fill( ) fillcolor("white") circle(20,360) end_fill( ) hideturtle( )
Sur ce modèle, essayer de construire la figure ci-dessous8 :
Enfin il est possible d’imbriquer une boucle dans une autre boucle. Essayer par exemple le code ci-dessous :
from turtle import * for i in range(1,5) :
for j in range(1,4) : up( )
goto(40*i,40*j) down( ) circle(10,360)
On notera qu’il est fait référence à i et j dans le corps des deux boucles : les cercles doivent être tracés à partir du point de coordonnées(40×i,40×j).
On peut aussi alterner les couleurs suivant la parité de i et j :on a déjà vu plus tôt dans l’année que pour un entiern :
n%2 =
(0 sinest pair, 1 sinest impair.
Sur cette idée, on peut faire en sorte d’alterner les couleurs des cercles colonne par colonne.
Modifier le code précédent comme ci-dessous et essayer de comprendre comment il fonctionne.
8. On écrira une fonction qui dessine un carré, puis soulève le crayon et le déplace jusqu’au point de départ du carré suivant. Ensuite on écrira une boucle qui répète cinq fois cette opération.
from turtle import * for i in range(1,5) :
for j in range(1,4) : up( )
couleur="red"*(i%2==0)+"blue"*(i%2==1) pencolor(couleur)
goto(40*i,40*j) down( ) circle(10,360)
6 Figures à construire
Dans cette section, il faut construire chacune des figures avec le code le plus élégant possible. On pourra commencer par définir des fonctions carre, triangle et disque qui dessinent respectivement un carré, un triangle équilatéral et un disque d’une couleur et d’une dimension données9.
Le soleil La spirale de carrés Le sapin
La triforce L’échiquier La marguerite
Le cône Le triangle de Sierpinski Le flocon de von Koch
9. Par exemple,carre(50,"green")dessinera un carré vert de côté 50.