Le module Turtle de Python¶
Comme promis, nous allons explorer de nombreuses expériences que nous offre le langage Python. Aujourd'hui c'est dessin!!
Le module Turtle
comme son nom ne l'indique pas, offre les fonctionnalités pour piloter un stylo virtuel qui écrit sur l'écran (on appelle cela le canvas).
Premier test¶
Maintenant que vous savez saisir du code Python, copiez et exécutez le code suivant.
Premier essai !
🐍 Script Python | |
---|---|
1 2 3 4 5 6 |
|
Bon ce n'est pas génial mais ce n'est que le début!
Les fonctionnalités de bases¶
Les fonctionnalités de base sont données dans ce tableau. Il en existe beaucoup d'autres mais les principales sont là:
Méthode | Paramètres | Description |
---|---|---|
forward() ou fd() |
distance |
Déplace la tortue vers l’avant de distance |
backward() ou bd() |
distance |
Déplace la tortue vers l’arrière de distance |
right() ou rt() |
angle |
Tourne la tortue dans le sens des aiguilles d’une montre |
left() ou lt() |
angle |
Tourne la tortue dans le sens contraire des aiguilles d’une montre |
up() |
aucun | Lève le crayon de la tortue |
down() ou pd() |
aucun | Abaisse le crayon de la tortue |
color() |
nom de couleur | Change la couleur de la tortue |
fillcolor() |
nom de couleur | Change la couleur de remplissage d’un polygone |
heading() |
aucun | Renvoie la direction courante |
position() |
aucun | Renvoie la position de la tortue |
goto() |
x, y |
Déplace la tortue vers la position x, y |
begin_fill() |
aucun | Enregistre le premier point d’un polygone a remplir |
end_fill() |
aucun | Ferme le polygone et le remplit de la couleur courante |
goto() |
x,y |
Va au point de coordonnées(x,y) |
speed() |
vitesse |
Détermine la vitesse du tracé( 0 est le maxi!) |
Pour plus d'informations, clicquez ici : Référence Turtle
Des exemples de plus en plus convaincants¶
Exo
Copier le code suivant et exécutez-le!
🐍 Script Python | |
---|---|
1 2 3 4 5 6 7 8 9 10 |
|
Remarquez que le tracé commence toujours par défaut au centre du canvas. Le programme sert à construire un triangle équlatéral de couleur rouge et de côté 200
.
Astuce
Si tu veux changer l'origine du tracé utilise par exemple la fonction goto(-100, 200)
, pour aller au point de coordonnées (-100, 200)
. Attention, n'oublie pas de lever le crayon (up()
) avant de te déplacer, puis de le reposer ensuite(pd()
)!
Exo
- Modifier le code précédent pour construire un triangle équilatéral de côté 100 puis 20.
- Modifier le code précédent pour avoir des triangles verts.
Si la modification est facile elle n'en demeure pas moins pénible: il faut changer tous les paramètres de fd()
pour modifier les longueurs des côtés. On va donc améliorer ce code en créant une variable cote
.
Exo
Modifier le code comme suit:
🐍 Script Python | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 |
|
Il suffit alors de changer la valeur de la variable cote
pour modifier la taille du triangle.
Autre amélioration: on répète trois fois les mêmes instructions. N'existe t-il pas une alternative pour éviter ces ré-écritures???
Info
Quand on veut répéter une ou des instructions dans un programme informatique, on utilise des boucles.
On fera un cours particulier sur les boucles et on se contente ici de les utiliser dans des situations très simples.
Exo
Modifier le code comme suit:
🐍 Script Python | |
---|---|
1 2 3 4 5 6 7 8 9 |
|
La boucle for
permet de répéter trois fois (range(3)
) ,le bloc d'instructions des lignes 6
et 7
: remarquez que c'est encore l'indentation qui permet d'identifier le bloc à répéter.
Un peu de couleur?
Si tu souhaites des triangles colorés, il te faudra définir la couleur de remplissage (fillcolor()
) et définir l'environnement de coloriage(begin_fill()
et end_fill()
)
Exemple
🐍 Script Python | |
---|---|
1 2 3 4 5 6 7 8 9 10 |
|
Exo
En t'inspirant du code précédent qui trace un triangle, écris un code qui construit des carrés remplis de couleur.
Exo
En utilisant le code précédent et les fonctionnalités ci-dessus, proposer un programme qui permet de construire la frise ci-dessous. La longueur des côtés augmentent de 25 pixels de gauche à droite.
Un plongeon vers les fonctions Python¶
Vous avez sans doute remarqué la pénibilité de l'exercice précédent: on répète cinq fois le même code en changeant finalement peu de choses. Pour se faciliter la tâche, nous allons présenter un nouveau concept que nous utiliserons très souvent: les fonctions.
Les fonctions en Python
Les fonctions en Python permettent de factoriser du code, c'est-à-dire de le rassembler sous un même nom.
Par exemple, nous allons définir la fonction tri
qui trace des triangles: elle a besoin de connaître la longueur d'un côté (et événtuellement d'autres choses) qui devient un paramètre formel de cette fonction. Voici le code:
Exemple
🐍 Script Python | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Une fonction se déclare avec la particule def
suivi de son nom tri
et de ses (éventuels) paramètres formels, long
ici.
Exo
Copier le code et exécutez-le. Que se passe t-il?
Apparemment, pas grand chose. En tout cas, pas de triangle en vue....
En exécutant le code, vous ne créez qu'un nouvel outil nommé tri
sans pour autant l'utiliser. Si vous voulez l'utilisez alors ajouter juste avant exitonclick()
, l'instruction tri(200)
: vous verrez apparaître le triangle correspondant.
En console?
Lorsque vous avez exécutez le script Python, vous pouvez aussi tapez l'instruction tri(200)
dans la console, après les trois chevrons >>>
.
On peut ajouter des paramètres à la fonction, par exemple en choisissant sa couleur.
Exemple
🐍 Script Python | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Col
Comprenez bien ce qui se passe: à l'appel de la fonction tri(200, 'green')
vous transmettez aux paramètres long
et couleur
les valeurs 200
et green
:
Col
Exo
- Construire un triangle de côté 150 et de couleur rouge
- Construire un triangle de côté 100 et de couleur jaune.
Exo
- Définir la fonction
carre
qui prend en paramètreslong
etcouleur
et qui construit un carre. - Définir la fonction
motif
qui prend en paramètreslong
,couleur_1
etcouleur_2
qui construit un triangle de côtélong
et couleurcouleur_1
puis à côté un carré de côtélong
et couleurcouleur_2
(comme dans la frise de l'exercice 6). - Définir enfin la fonction
frise
qui prend en paramètresn
,long
,couleur_1
etcouleur_2
et qui construitn
motifs précédents les uns à côté des autres.
Si vous avez réussi la mission précédente, les motifs ne changent pas de taille à chaque appel des fonctions. On peut changer cela en faisant évoluer les valeurs de la variable long
à chaque tour de boucle!
Astuce
L'instruction long = long + 10
fait évoluer la variable de 10 en 10. Attention, il faut que la variable soit initialisée pour utiliser cette instruction.
On peut aussi utiliser long = long * 1.1
qui augmente la valeur de la variable de 10% à chaque appel.
Exo
- Copier et exécutez le code suivant:
🐍 Script Python 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
from turtle import * speed(0) #vitesse maximale def tri(long, couleur): fillcolor(couleur) begin_fill() for i in range(3): fd(long) lt(120) end_fill() def joli_dessin(n, long, couleur): for i in range(n): tri(long, couleur) long = long + 5 lt(10) joli_dessin(20, 50, 'magenta' ) exitonclick()
- Utiliser la fonction
joli_dessin
avec de nouveaux paramètres.
Appel psychédélique!¶
La frise précédente construit des triangles d'une même couleur: ne pourrait-on pas choisir une couleur différente à chaque construction?
Comme souvent en informatique, la réponse est OUI!
Mode de coloration
Nous allons définir des couleurs aléatoires en précisant leurs composantes (R,V,B)
à l'aide la méthode randint(0, 255)
.
Rappelons que chaque composante de couleur est codée sur 1 octet qui offre donc 256 niveaux possibles (de 0 à 255!).
Information importante
Il faut dire à Turtle
que le mode de coloration n'est plus par le choix littéral de la couleur(red
, yellow
,...) mais par la donnée des composantes (R,V,B)
. Pour cela on utilise l'instruction colormode(255)
au début du programme.
Exo
Copier et exécutez le code suivant. Attention à vos yeux!
🐍 Script Python | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
Remarquez que couleur
n'est plus un paramètre de la fonction joli_dessin
car le choix de sa valeur n'est plus de notre responsabilité!
Pour le plaisir des yeux¶
Voici quelques exemples de possibilités du module Turtle
. Parfois simple souvent plus compliqué, n'hésitez pas à trafiquer le code ... et si vous ne comprenez pas tout ce n'est pas grave!
Un beau soleil
from turtle import *
speed(0)
n = int(input("Nombre de côtés (au moins 3)"))
hideturtle()
pencolor("yellow")
bgcolor("orange")
for i in range(n):
right(90) # on va tracer vers le bas
forward(100) # on trace un trait de longueur 100
back(100) # on trace à reculons
left(90)
circle(50, 360/n)
mainloop()
Cercle pysché
from turtle import *
from random import *
speed(15)
up()
back(450)
right(90)
down()
colors = ["yellow","cyan","purple","turquoise",
"orange","red","lime","indianred","gold",
"chartreuse","aquamarine","indigo","violet",
"chocolate","tan","plum"]
rayon = 5
nb = 50
for i in range(1, nb):
fillcolor(choice(colors))
begin_fill()
circle(250 - rayon*i)
end_fill()
hideturtle()
exitonclick()
Spirale
from turtle import *
pencolor("blue")
speed(10)
for i in range (1, 90):
for j in range(2):
forward(5*i)
right(89.5)
exitonclick()
Arbre
from turtle import *
speed (0)
angle = 30
color("darkred")
def arbre(n, longueur ):
if n == 0:
color("green")
forward(longueur)
backward(longueur)
color("darkred")
else:
width(n)
forward(longueur / 3)
left(angle)
arbre(n - 1, longueur / 3 * 2)
right (2* angle)
arbre(n - 1, longueur / 3 * 2)
left(angle)
backward(longueur / 3)
hideturtle ()
up()
right(90)
forward(300)
left (180)
down()
arbre (11, 700)
exitonclick()