Aller au contenu

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
from turtle import *
forward(120)  #avance de 120 pixels
left(90)      #tourne à gauche(sens contraire des aiguilles) de 90°
color('red')  #change la couleur en rouge (noir par défaut)
forward(80)   #avance de 80 pixels
exitonclick() #ferme la fenêtre au clic de souris

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
from turtle import *
speed(0)      #vitesse maximale
color('red')  #change la couleur en rouge (noir par défaut)
fd(200)  #avance de 200 pixels
lt(120)     #tourne à gauche(sens contraire des aiguilles) de 120°
fd(200)  #avance de 200 pixels
lt(120)     #tourne à gauche(sens contraire des aiguilles) de 120°
fd(200)  #avance de 200 pixels
lt(120)     #tourne à gauche(sens contraire des aiguilles) de 120°
exitonclick() #ferme la fenêtre au clic de souris

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

  1. Modifier le code précédent pour construire un triangle équilatéral de côté 100 puis 20.
  2. 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
from turtle import *
speed(0)      #vitesse maximale
color('red')  #change la couleur en rouge (noir par défaut)
cote = 125
fd(cote)  #avance de cote pixels
lt(120)     #tourne à gauche(sens contraire des aiguilles) de 120°
fd(cote)  #avance de cote pixels
lt(120)     #tourne à gauche(sens contraire des aiguilles) de 120°
fd(cote)  #avance de cote pixels
lt(120)     #tourne à gauche(sens contraire des aiguilles) de 120°
exitonclick() #ferme la fenêtre au clic de souris

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
from turtle import *
speed(0)      #vitesse maximale
color('red')  #change la couleur en rouge (noir par défaut)
cote = 125
for i in range(3): #boucle qui permet de répéter 3 fois les instructions suivantes
    fd(cote)  #avance de cote pixels
    lt(120)   #tourne à gauche(sens contraire des aiguilles) de 120°

exitonclick() #ferme la fenêtre au clic de souris

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
from turtle import *
speed(0)           #vitesse maximale
fillcolor('gold')  #change la couleur de remplissage en gold (noir par défaut)
cote = 125
begin_fill()       #debut du coloriage d'une forme fermée
for i in range(3):
    fd(cote)       #avance de cote pixels
    lt(120)        #tourne à gauche(sens contraire des aiguilles) de 120°
end_fill()         #fin du coloriage
exitonclick()      #ferme la fenêtre au clic de souris

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.

frise

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
from turtle import *
speed(0)           #vitesse maximale

def tri(long):
    fillcolor('red')
    begin_fill()       
    for i in range(3):
        fd(long)       
        lt(120)        
    end_fill()         

exitonclick()      

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
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()         

tri(200, 'green')

exitonclick()      

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

fonction

Exo

  1. Construire un triangle de côté 150 et de couleur rouge
  2. Construire un triangle de côté 100 et de couleur jaune.

Exo

  1. Définir la fonction carre qui prend en paramètres long et couleur et qui construit un carre.
  2. Définir la fonction motif qui prend en paramètres long, couleur_1 et couleur_2 qui construit un triangle de côté long et couleur couleur_1 puis à côté un carré de côté long et couleur couleur_2 (comme dans la frise de l'exercice 6).
  3. Définir enfin la fonction frise qui prend en paramètres n, long, couleur_1 et couleur_2 et qui construit n 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

  1. 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()      
    
  2. 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
from turtle import *             #import des modules nécessaires
from random import randint

speed(0)                         #vitesse maximale
colormode(255)                   #mode de coloration en RVB

def tri(long, couleur):
    fillcolor(couleur)
    begin_fill()       
    for i in range(3):
        fd(long)       
        lt(120)        
    end_fill()         


def joli_dessin(n, long):
    for i in range(n):
        couleur = (randint(0, 255), randint(0, 255), randint(0, 255))
        tri(long, couleur)
        long = long + 5
        lt(10)

joli_dessin(20, 50)
exitonclick()      

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

🐍 Script Python
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é

🐍 Script Python
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

🐍 Script Python
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

🐍 Script Python
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()