Dans cette activité, vous allez apprendre à réaliser de petits dessins en utilisant Python et son module Turtle.
Ce module d'initiation à la programmation se nomme Turtle car on peut utiliser une icône de tortue qui se déplace sur l'écran et qui dessine peu à peu un dessin en exécutant ce qu'on lui demande.
Une rose rouge
Cette activité vous permettra de comprendre qu'un programme s'exécute ligne par ligne et qu'on ne passe à la ligne suivante que lorsque la ligne actuelle a été entiérement traitée.
Ce principe se nomme la séquentialité.
Logiciel nécessaire pour l'activité : Python 3 : Thonny, IDLE ou le site repl.it ...
Image issue de http://hcc-cs.weebly.com/variables.html
Le mécanisme des variables consiste à créer une liaison entre un NOM et un CONTENU MEMOIRE.
On peut représenter ce mécanisme comme une boite qui porte un NOM et dans laquelle on place le CONTENU associé.
Pour affecter un contenu à un nom de variable, on réalise ce qu'on nomme une affectation.
1
a=10
L'opérateur = permet de créer une variable nommée a et y stocker la valeur 10.
Mais en réalité, il vaut mieux la voir comme un moyen de faire la liaison entre un NOM et un CONTENU en mémoire :
Notez bien que c'est le CONTENU 10 qu'on associe au NOM a : on va de la droite vers la gauche. C'est pour cela qu'on écrit a ← 10 dans les algorithmes.
Lecture du contenu
Pour obtenir d'une variable, il suffit de taper son nom.
Sans le mécanisme de variable ?
En réalité, le contenu associé à la variable est stocké dans la mémoire et possède donc une adresse ou un identifiant.
Or, avec le mécanisme NOM-CONTENU, nous n'avons pas eu à gérer cette mémoire : c'est Python qui se charge de
trouver une adresse utilisable,
de la remplir et
de l'associer avec notre nom de variable.
(Rappel) 1.2 - VARIABLE - Incrémentation
Incrémenter veut dire modifier la valeur en lui rajoutant une autre valeur.
Incrémenter de 1 veut dire qu'on augmente la valeur de 1 : 45 passe à 46. Ce +1 est la valeur par défaut en l'absence d'information.
Incrémenter de 2 veut dire qu'on augmente la valeur de 2 : 45 passe à 47.
Incrémenter de -1 veut dire qu'on augmente la valeur de -1 : 45 passe à 44. On dit plutôt décrémenter.
Pour incrémenter a de 1 : a=a+1
a = a + 1 : évaluer la valeur actuelle de a,
a = a + 1 : évaluer (calculer) ce que donne cette valeur + 1 et
a = a + 1 : affecter le résultat de cette évaluation à a.
1
2
a=10a=a+1
En ligne 1, on associe 10 à a.
En ligne 2, on évalue a + 1, ce qui donne 11. On place ENSUITE ce résultat de 11 dans a : au final, a contient donc 11.
(Rappel) 1.3 FONCTION : notion
ENTREE(S)
⇒
Fonction
⇒
SORTIE
Description
Les fonctions sont des instructions particulières qui :
recoivent des données d'entrée et
renvoient leur réponse en sortie.
Un exemple avec la fonction VALEUR_ABSOLUE qui n'attend qu'une entrée (un nombre) et qui renvoie la valeur absolue du nombre (le même nombre mais sans son signe).
-12
⇒
Fonction VALEUR ABSOLUE
⇒
12
12
⇒
Fonction VALEUR ABSOLUE
⇒
12
D'autres exemples
5; 10; 50; 0; 20
⇒
Fonction MAXIMUM
⇒
50
5; 10; 50; 0; 20
⇒
Fonction MINIMUM
⇒
0
5; 10; 50; 0; 20
⇒
Fonction SOMME
⇒
85
(Rappel) 1.4 - FONCTION : native
Une fonction native est une fonction présente de base dans Python.
On en fait l'appel en notant son nom et en fournissant entre parenthèses les entrées séparées par des virgules.
nom_fonction(a, b, c, d...)
Dans le cadre de ce site, les fonctions natives sont toujours écrites en vert.
Fonction VALEUR ABSOLUE : cette fonction se nomme abs() en Python.
>>> abs(-12)12>>> abs(12)12
Fonction MAXIMUM : cette fonction se nomme max() en Python.
>>> max(10, 0, 50, 40)50
01° Ouvrir Thonny. Aller dans le menu Affichage/Views et sélectionner Variables si l’onglet Variables n’est pas ouvert.
Vous devriez constater qu'une nouvelle fenêtre est désormais disponible dans la partie droite de Thonny :
Ecran de Thonny
Dans la zone Console (celle avec 3 chevrons >>>), tapez les instructions (en jaune).
>>> 50 + 2
Effet ?>>> a = 50
Effet ?>>> b = 20
Effet ?
Question
Que constate-on dans l'onglet variable de Thonny ?
...CORRECTION...
>>> 50 + 2
52Effet ? Python évalue l'expression 50 + 2 à 52 et l'affiche dans la console>>> a = 50
Effet ? Affectation de la variable a, référençant 50 (sans affichage dans la console)>>> b = 20
Effet ? Affectation de la variable b, référençant 20 (sans affichage)
02-A° A votre avis, que va-t-on maintenant voir dans la console si on tape ceci :
>>> a + b
Effet ?
...CORRECTION...
Affichage car on ne stocke pas le résultat.
>>> a + b
70Effet ? Python évalue a + b à 70 et l'affiche dans la console
02-B° A votre avis, que va-t-on maintenant voir dans la console si on tape ceci :
>>> c = a + b
Effet ?
...CORRECTION...
Aucun affichage puisqu'on stocke le résultat.
>>> c = a + b
Effet ? Python évalue a + b à 70 et place le résultat dans la variable c. Aucun affichage du coup.
02-C° A votre avis, comment sera évaluée cette expression comportant un appel de fonction ? Vérifiez ensuite votre réponse.
>>> 10 * max(5, 2, 3, 6, 1)
...CORRECTION...
L'interpréteur va commencer par évaluer max(5, 2, 3, 6, 1) à 6.
Ensuite, il suffit de multiplier cela par 10.
On va donc obtenir 60.
>>> 10 * max(5, 2, 3, 6, 1)
60
03 ✔° Utiliser l'animation suivante pour être certain de bien visualiser le déroulement progressif que nous voulons observer aujourd'hui.
1
2
3
a=200b=a * 2fin du programme
CLIQUEZ ICI POUR VOIR LE DEROULEMENT :
Comme on peut le voir, le programme se déroule séquentiellement : une ligne à la fois, en partant de la ligne du haut et en se dirigeant vers le bas. L'ordinateur va donc évaluer et exécuter une ligne à la fois.
NOUVEAUTES : Mode debug de Thonny :
1.5 Mode DEBUG de Thonny
On peut demander à Thonny d'exécuter un programme ligne par ligne.
Pour lancer le programme en mode DEBUG : appuyez sur le petit insecte (bug), celui à droite de la flèche verte.
L'interpréteur va alors surligner en jaune la prochaine ligne qu'il désire exécuter.
Pour donner l'autorisation d'exécuter la ligne surlignée : appuyez sur le bouton à droite de l'insecte.
A vous de valider progressivement les lignes de façon à tracer la forme en visualisant bien que Python les exécute une à une dans l'ordre prédéfini.
Exemple avec un programme linéaire
Voici le programme avant d'appuyer sur quoi que ce soit :
Après avoir appuyé sur DEBUG, Thonny attend qu'on lui donne l'autorisation d'exécuter la première ligne en appuyant sur la touche à droite de DEBUG :
Après avoir autorisé la ligne, on voit que la variable a a été créée. Thonny attend maintenant l'autorisation d'effectuer la ligne 2 :
Ecran de Thonny
04° Réfléchir à ce que va faire le programme ci-dessous, pas à pas. Activer ensuite le mode DEBUG pour parvenir à exécuter le programme ligne par ligne.
1
2
3
4
a=20b=10c=a*bprint(c)
...CORRECTION...
Ligne 1, on déclare a comme valant 20.
Ligne 2, on déclare b comme valant 10.
Ligne 3, on déclare c comme valant 20 * 10, soit 200.
Ligne, on demande l'affichage de c dans la console. On observe donc 200.
✌ 05° Réfléchir à ce que va faire le programme ci-dessous, pas à pas. Activer ensuite le mode DEBUG pour parvenir à exécuter le programme ligne par ligne. Que vaut c à la fin ? En quoi cela est-il lié à la séquentialité de l'exécution ligne par ligne ?
La séquentialité est une notion fondamentale : lorsqu'on fournit un programme comportant plusieurs lignes à l'interpréteur, il ne les exécute pas au hasard. Il les exécute ligne par ligne, en commençant par la première et en passant à la suivante uniquement après avoir correctement exécuté la ligne en cours.
Aujourd'hui, vous allez dessiner un peu, en expliquant à la machine ce qu'elle doit faire, étape par étape, instruction par instruction.
06-A ✔° Utiliser les instructions suivantes une à une pour visualiser leurs effets.
Encart d'instructions n°1
>>> import turtle as trt
✱ On demande d'importer dans l'interpréteur les instructions permettant de dessiner.
✱ On voit que trt est apparu dans la zone des variables : nous allons maintenant avoir le droit d'utiliser le module turtle.
Encart d'instructions n°2
>>> crayon = trt.Turtle()
Notez bien la présence d'un T majuscule et d'un t minuscule, ainsi que de parenthèses ().
✱ On crée une variable crayon à partir du module Turtle. Cette variable contient la référence-mémoire du crayon et elle nous permettra d'agir sur ce crayon.
✱ Visuellement, cela ouvre une fenêtre graphique et y place une flèche orientée vers la droite : la flèche symbolise le crayon.
06-B ✔° Modifier maintenant la disposition des fenêtres d'affichage pour obtenir quelque chose qui ressemble à ceci
Le site à gauche
Thonny en haut à droite
La fenêtre graphique de Turle en bas à droite
Faire appel à l'enseignant si vous ne parvenez pas à obtenir ce visuel. Sinon, le reste de l'activité n'aura aucun sens.
06-C ✔° Voici la suite des instructions. Tester chaque instruction dans la console :
Encart d'instructions n°3
>>> crayon.right(90)
✱ Visuellement : la flèche tourne de 90° vers la droite à partir de son orientation actuelle.
>>> crayon.left(90)
✱ Visuellement : idem, on tourne de 90° vers la gauche à partir de son orientation actuelle.
la flèche avance de 50 pixels dans le sens indiqué et trace un trait noir.
la flèche avance de 100 pixels et trace un trait noir.
la flèche recule de 150 pixels par rapport au sens indiqué, et trace un trait noir.
>>> crayon.backward(50)
la flèche recule de 50 pixels. C'est l'équivalent de dire forward(-50).
Encart d'instructions n°5
Notez bien qu'on utilise "red" et pas juste red. Nous verrons bientôt que ces guillemets indiquent qu'on fournit une chaîne de caractères.
>>> crayon.pencolor("red")
✱ On change la couleur du crayon.
>>> crayon.forward(50)
✱ On avance en traçant en rouge
Encart d'instructions n°6
>>> crayon.penup()
✱ On empêche l'objet de tracer des traits (symboliquement, on lève la pointe du crayon virtuel.
>>> crayon.forward(-200)
✱ On recule sans faire de nouvelle trace puisque le crayon est levé
>>> crayon.pendown()
✱ On permet à nouveau à l'objet de tracer des traits (symboliquement, on abaisse la pointe du crayon virtuel sur la feuille.
>>> crayon.forward(200)
✱ On avance en traçant un trait puisque le crayon est abaissé.
Encart d'instructions n°7
>>> crayon.clear()
✱ On fait disparaître les traits créés par l'objet nommé crayon.
Encart d'instructions n°8
>>> crayon.home()
✱ On ramène le crayon au centre et on le replace en orientation vers la droite. Comme le crayon était 'posé', il a dessiné un trait.
Juste un mot sur ... fonction et méthode
Avec l'apparition des parenthèses entre lesquelles on transmet (ou pas) des données, on voit que forward(), pencolor() ou encore penup() sont des fonctions mais dont la syntaxe d'utilisation est un peu étrange.
Ces fonctions particulières qui agissent sur l'objet placé devant elles se nomment des méthodes.
Quelle est cette syntaxe ? On donne le nom d'un objet sur lequel agir, on place un point et on donne ensuite le nom de la méthode et les données sur lesquelles la méthode devra travailler :
objet.methode(données)
>>> crayon.forward(200)
Traduction : va chercher le crayon, et fait le avancer de 200.
✌ 07° Dans la console, déclarez un crayon puis utilisez le pour dessiner un carré de 200 pixels de côté.
Les couleurs des côtés devront être "red", "pink", "blue" et "orange".
...CORRECTION...
Si vous n'avez plus de crayon en mémoire, ni même le module Turtle, il faut retaper ceci :
>>> import turtle as trt
>>> crayon = trt.Turtle()
Ensuite, on part sur la création de la forme elle-même/
08° Le dessin serait-il le même si on traçait les instructions dans un ordre aléatoire ?
...CORRECTION...
Non, nous obtiendrions un dessin différent.
09° Si je vous demande de tracer un nouveau carré, qu'allez-vous devoir faire ? Est-ce que ça a l'air sympa comme idée ? Que constatez-vous si vous placez la souris au dessus de la console et que vous tapez plusieurs fois sur la touche FLECHE DU HAUT ?
...CORRECTION...
Pour tracer un nouveau carré, il faudra retaper toutes les instructions... A part la première (celle où on crée le crayon) si vous n'avez pas encore relancé Thonny.
Et non, l'idée d'avoir à tout retaper à chaque fois qu'on veut tracer un carré n'a rien de réjouissant !
On constate par contre qu'on récupère les dernières choses fournies à la console en utilisant la flèche HAUT.
Si vous êtes ici, vous avez dû vous rendre compte de la séquentialité : à la moindre erreur, pas possible de repartir en arrière. L'interpréteur a exécuté votre ligne, tant pis...
Nous allons maintenant quitter la console et écrire des programmes qui réalisent directement nos dessins.
Nous allons maintenant revoir comment programmer et enregistrer plutôt que d'exécuter immédiatement dans la console. Nous allons utiliser une nouvelle zone de Thonny.
Nous allons donc maintenant travailler dans la zone du haut, celle qui permet de créer des scripts.
Nous allons créer au début un petit programme qui ne fait que 2 choses :
Créer un crayon
Utiliser le crayon pour dessiner un rectangle
10 ✔° Copier-coller le programme suivant dans la zone du haut de Thonny, celle permettant de créer le script (celle sans les trois chevrons) :
11 ✔° Utiliser FILE - SAVE AS ou FICHIER - ENREGISTRER SOUS pour enregistrer le fichier (que vous nommerez acti_turtle.py) dans un dossier que vous parviendrez à retrouver facilement. Le mieux est donc d'ouvrir votre dossier personnel sur le réseau, d'y créer un repertoire NSI, puis un répertoire PYTHON3 et de sauvegarder votre programme dans ce sous-répertoire.
Si vous ne savez pas gérer cela, pensez à demander de l'aide !
Vous devriez voir apparaître ceci :
C'est comme si vous aviez tapé ces instructions dans la console SAUF que, si vous voulez tracer un autre rectangle, il suffit de réappuyer sur la flèche verte pour relancer le script.
✌ 12° Modifier le programme pour tracer un rectangle vert :
13 ✔° Nous allons demander à l'interpréteur de l'exécuter ligne par ligne.
Pour lancer le programme en mode DEBUG : appuyez sur le petit insecte (bug), celui à droite de la flèche verte.
L'interpréteur va alors surligner en jaune la prochaine ligne qu'il désire exécuter.
Pour donner l'autorisation d'exécuter la ligne surlignée : appuyez sur le bouton à droite de l'insecte.
A vous de valider progressivement les lignes de façon à tracer la forme en visualisant bien que Python les exécute une à une dans l'ordre prédéfini.
Maintenant que vous savez créer un programme, voyons quelques nouveautés sur Turtle.
14 ✔° Utiliser le programme ci-dessous qui montrent comment utiliser deux nouvelles méthodes de Turtle.
goto() permet de déplacer le crayon en fournissant les coordonnées x et y à atteindre (en utilisant le repère cartésien classique).
write() d'écrire un texte à l'endroit où se trouve la tortue.
Voici le visuel que provoquera ce nouveau programme :
✱ Ecrit le message Bonjour sur la localisation actuelle de la tortue.
16 ✔° Lire les encarts 11 et 12, lancer le programme pour vérifier que vous comprennez bien pourquoi le dessin est généré de cette façon :
Encart d'instructions n°11
>>> crayon.dot(45, "red")
✱ Affiche un point de 45 pixels de large et de couleur rouge. La tortue reste au centre du point.
Encart d'instructions n°12
>>> crayon.circle(80, 180)
✱ Trace un arc de cercle de 80 pixels de rayon et sur un angle de 180°. Cela revient donc à tracer un demi-cercle puisque :
Avec 360°, on obtient un cercle entier.
Avec 180°, on obtient un demi-cercle.
Avec 90°, on obtient un quart de cercle.
Avec 45°, on obtient un huitième de cercle.
>>> crayon.circle(80)
✱ Trace un arc de cercle complet de 80 pixels de rayon. On ne donne pas d'indication d'angle. Par défaut, Turtle est configuré pour prendre 360° dans ce cas.
✌ 17° Lire l'encart 13 qui explique le rôle de setheading(). MODIFIER le programme pour obtenir un visuel proche de celui qui est proposé ici. Pour l'instant, vous n'avez qu'une partie des cercles.
Encart d'instructions n°13
>>> crayon.setheading(45)
✱ Impose que la tortue soit maintenant orientée à 45° par rapport à l'axe vertical. Comprenez bien qu'il ne s'agit pas de tourner de 45° par rapport à l'angle actuel mais de s'orienter vers l'angle 45° quelque soit l'orientation actuelle de la tortue.
Voici un descriptif visuel des différents angles :
✎ 20 / TRAVAIL PERSONNEL° Utilisez le temps qu'il vous reste pour réaliser le dessin le plus sympa possible. La fiche ci-dessous récapitule les actions vues aujourd'hui. Aller voir la partie Frequently Asked Questions (FAQ) pour voir comment personnaliser les couleurs si vous le voulez.
Vous allez être noté sur l'originalité mais également sur l'utilisation des différentes instructions proposées dans les parties précédentes.
Au moins un carré, ou un triangle ou un rectangle
Au moins un cercle
Au moins deux couleurs de crayon
Au moins deux épaisseurs de crayon
Au moins deux fonds colorés
Au moins deux utilisations de goto() et penup(), pendown().
Au moins une boucle
Des commentaires expliquant les lignes (placer # derrière l'instruction : le reste ne sera que du texte à destination du lecteur humain)
Impossible d'avoir plus de 06/20 s'il manque l'un des items.
Mémo Turtle
Création du crayon
N'oubliez pas d'importer au préalable le module Turtle avec importturtleastrt par exemple.
Voici quelques méthodes qu'on peut appliquer aux objets de classe Turtle, qu'on crée à l'aide de crayon=trt.Turtle().
Commandes de base
Pour avancer : crayon.forward(50) permet d'avancer de 50 pixels.
Pour reculer : crayon.backward(50) permet de reculer de 50 pixels.
Pour tourner à droite : crayon.right(45) permet de tourner de 45° à droite par rapport à l'orientation actuelle.
Pour tourner à gauche : crayon.left(45) permet de tourner de 45° à gauche par rapport à l'orientation actuelle.
Pour orienter le crayon sur un angle de 45° absolu (0° étant la droite horizontale) : crayon.setheading(45)
Les différents angles absolus d'orientation
Pour changer la couleur du crayon : crayon.pencolor("red").
Déplacements aux coordonnées voulues
Pour aller faire un mouvement linéaire jusqu'au point de coordonnées (x=50,y=100), 3 manières de procéder :
crayon.goto(50, 100)
crayon.setposition(50, 100).
crayon.setpos(50, 100)
Système d'axes xy de Turtle
Dans le cadre de ce site, on utilisera uniquement le goto(). Mais si vous trouvez des programmes sur le Web utilisant les autres, vous savez maintenant que cela réalise la même action.
Pour faire un mouvement horizontal jusqu'à atteindre la valeur donnée en x=50 : crayon.setx(50).
Pour faire un mouvement vertical jusqu'à atteindre la valeur donnée en y=100 : crayon.sety(100).
Pour revenir au point d'origine : crayon.home().
Dessiner des cercles ou d'autres formes encore
Pour dessiner un cercle de rayon x : crayon.circle(x).
Pour dessiner un arc de cercle d'angle 180° et de rayon 60 pixels : crayon.circle(60, 180).
Pour tracer des polygones de "rayon" 60 pixels possèdant 8 côtés : crayon.circle(60, 360, 8).
Pour placer un point de rayon 5 et de couleur rouge : crayon.dot(5, "red").
DESSINER, ARRÊTER DE TRACER OU SUPPRIMER
Pour lever la pointe du crayon : crayon.penup().
Pour abaisser la pointe du crayon : crayon.pendown().
Texte
Pour écrire un texte : crayon.write("bonjour").
Taille et vitesse du crayon
Pour modifier la vitesse x, x variant de 1 à 10 : crayon.speed(3), x=0 veut dire pas d'animation.
Pour augmenter la taille du crayon : crayon.pensize(5).
Cela nous suffira mais vous pouvez aller voir la documentation Python pour voir ce que le module peut faire d'autre : DOCUMENTATION TURTLE PYTHON.