SNT Python 4

Identification

Infoforall

4 - Les fonctions avec le module Turtle


Voyons maintenant comment faire des dessins complexes avec Turtle sans avoir à taper un nombre important de lignes de code.

Comment ?

En utilisant des fonctions bien entendu.

IDE Python proposé : Thonny

Documents de cours : pdf ou odt.

1 - Rappels

Ne nommer pas votre fichier turtle ou python ou thonny. Donner leur un nom qui ne sont pas un fichier potentiellement déjà existant que vous risqueriez d'écraser...

snt4 est un bon nom pour votre programme sur cette activité.

Rappels sur Turtle

1 - Les 3 instructions basiques

Nous avions vu ce programme permettant de tracer un rectangle. Comment ?

  • En important le module
  • En créant un crayon avec Turtle()
  • En faisant avancer le crayon avec crayon.forward(50)
  • En faisant tourner le crayon avec crayon.left(90)
  • En changeant la couleur du crayon avec crayon.pencolor('red')
1 2 3 4 5 6 7 8 9 10 11 12 13
from turtle import Turtle crayon = Turtle() largeur = 50 hauteur = 100 crayon.forward(largeur) crayon.left(90) crayon.forward(hauteur) crayon.pencolor('red') crayon.left(90) crayon.forward(largeur) crayon.left(90) crayon.forward(hauteur)
Exemple 1
Visuel obtenu avec Turtle

2 - Remplissage d'une forme

Nous avions vu également qu'on pouvait préciser qu'on voulait remplir notre forme avec un fond coloré en rajoutant 3 choses autour de la forme voulue :

  1. Préciser la couleur de remplissage (fillcolor)
  2. Préciser où commence la forme à remplir (begin_fill)
  3. Préciser où finit la forme à remplir (end_fill)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
from turtle import Turtle crayon = Turtle() largeur = 50 hauteur = 100 crayon.fillcolor('orange') crayon.begin_fill() crayon.forward(largeur) crayon.left(90) crayon.forward(hauteur) crayon.pencolor('red') crayon.left(90) crayon.forward(largeur) crayon.left(90) crayon.forward(hauteur) crayon.end_fill()
Fond orange
Un rectangle avec un fond coloré orange

3 - D'autres instructions

Nous avons également vu de nombreuses autres fonctions dont voici le rappel :

  1. crayon.goto(0, 150)

    veut dire de placer le crayon aux coordonnées x=0 et y=150. Le (0,0) est le centre de l'écran. Les coordonnées (x,y) sont similaires au repère classique : x positif vers la droite et y positif vers le haut.

  2. crayon.setheading(45)
  3. veut dire d’orienter le crayon sur un angle de 45° absolu (0° la droite)

  4. crayon.penup()
  5. veut dire de lever le crayon (on arrête donc de dessiner en le déplacant).

  6. crayon.pendown()
  7. veut dire d’abaisser la pointe du stylo : on recommence à dessiner.

  8. crayon.circle(50,180)
  9. veut dire de tracer un arc de cercle de 50 pixels et d’angle 180° (1/2 cercle)

  10. crayon.circle(100)
  11. veut dire de tracer un cercle de rayon 100 pixels (et d’angle 360°)

  12. crayon.pensize(6)
  13. veut dire de tracer les traits avec une épaisseur de 6 pixels.

  14. crayon.write("Bonjour")
  15. veut dire d'écrire "Bonjour" à l'écran.

Les fonctions

Une fonction est un bout de code qu'on place en mémoire pour pouvoir l'utiliser plus tard.

Le placement en mémoire de la fonction se nomme la déclaration.

L'utilisation de la fonction se nomme l'appel.

La fonction peut possèder des paramètres qui sont des variables particulières : elles ne se remplissent qu'à l'appel de la fonction avec ce que l'utilisateur envoie à ce moment.

Exemple de déclaration de fonction :

1 2 3
def mystere(a, b, c): # Prototype de la fonction (3 paramètres locaux a, b et c) reponse = a + b*2 + c # On crée une variable locale reponse qui sera supprimée à la fin return reponse # On renvoie

Exemple d'appel de fonction :

>>> mystere(2, 10, 7) 29

Lors de cet appel, on trouve ce que vont recevoir les paramètres a, b et c en comparant l'ordre des envois lors de l'appel et l'ordre des paramètres lors de la déclaration.

1
def mystere(a, b, c):
>>> mystere(2, 10, 7)

On voit alors bien que a reçoit 2, b reçoit 10 et c reçoit 7.

Finalement, une fonction peut répondre à la personne qui en lance l'appel. Comment ? En renvoyant ce qui se trouve derrière le mot-clé return.

2 - Fonction permettant de dessiner une forme simple

01° Mettre en mémoire les fonctions suivantes : il faut les placer en copier-coller dans la zone PROGRAMME puis SAUVEGARDER et LANCER LE PROGRAMME : flèche verte dans Thonny.

  1. carre_vide permet de dessiner un carré à la position x,y à l’aide d’un crayon nommé cr. Elle renvoie le nombre de pixels parcourus par le crayon.
  2. couleurs permet de modifier les caractéristiques (notamment les couleurs) d'un crayon cr qu'on lui transmet. Elle renvoie un string signalant que cela est effectué.
  3. carre_plein permet de dessiner un carré possédant un fond coloré à la position x,y à l’aide d’un crayon nommé cr. Elle renvoie le nombre de pixels parcourus par le crayon.
  4. disque devra permettre une fois codée de dessiner un disque possédant un fond coloré à la position x,y à l’aide d’un crayon nommé cr. Elle devra renvoyer le nombre de pixels parcourus par le crayon.
  5. triangle devra permettre une fois codée de dessiner un triangle possédant un fond coloré à la position x,y à l’aide d’un crayon nommé cr. Elle devra renvoyer le nombre de pixels parcourus par le crayon.
  6. maison va contenir nos instructions en vu de dessiner des choses.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
from turtle import Turtle def carre_vide(cr, x, y, cote): cr.penup() cr.goto(x,y) cr.pendown() cr.forward(cote) cr.left(90) cr.forward(cote) cr.left(90) cr.forward(cote) cr.left(90) cr.forward(cote) cr.left(90) return cote * 4 def couleurs(cr, fond, ecriture, taille): cr.pencolor(ecriture) cr.fillcolor(fond) cr.pensize(taille) return 'Le crayon a été modifié' def carre_plein(cr, x, y, cote): cr.penup() cr.goto(x,y) cr.pendown() cr.begin_fill() cr.forward(cote) cr.left(90) cr.forward(cote) cr.left(90) cr.forward(cote) cr.left(90) cr.forward(cote) cr.left(90) cr.end_fill() return cote * 4 def disque(cr, x, y, rayon): cr.penup() cr.goto(x,y) cr.pendown() cr.begin_fill() # à vous de dessiner un cercle cr.end_fill() return 0 def triangle(cr, x, y, cote): return 0 def maison(cr): d1 = carre_vide(cr, 50, 20, 100) crayon = Turtle() maison(crayon)
  1. Sur quelle ligne demande-t-on à l'interpréteur Python de nous créer un crayon ?
  2. Sur quelle ligne lance-t-on l'appel à la fonction maison ?
  3. Sur quelle ligne déclare-t-on la fonction maison ?
  4. Que semble faire pour le moment la fonction maison ?
  5. Comment l'interpréteur Python sait-il que les lignes 57 et 58 ne sont pas dans la fonction maison ?

...CORRECTION...

  1. Ligne 57
  2. 57
    crayon = Turtle()
  3. Ligne 58
  4. 58
    maison(crayon)
  5. Ligne 53
  6. 53
    def maison(cr):
  7. Ligne 54 : elle trace un carré vide.
  8. 54
    d1 = carre_vide(cr, 50, 20, 100)
53 54 55 56 57 58
def maison(cr): d1 = carre_vide(cr, 50, 20, 100) crayon = Turtle() maison(crayon)
  • Comment l'interpréteur Python sait-il que les lignes 57 et 58 ne sont pas dans la fonction maison ? Simplement car elles ne sont pas indentées : elles sont contre le bord de l'écran et n'appartiennent pas à la fonction contrairement à la ligne 54.
  • 02° Que vont contenir respectivement cr, x, y et cote lors de l’appel suivant :

    54
    d1 = carre_vide(cr, 50, 20, 100)
    Résultat de l'appel
    Le résultat de l'appel précédent

    ...CORRECTION...

    Il faut comparer la déclaration et l'appel :

    Déclaration

    4
    def carre_vide(cr, x, y, cote):

    Appel

    54
    d1 = carre_vide(cr, 50, 20, 100)

    On voit alors ceci :

    • cr cr
    • x 50
    • y 200
    • cote 100

    03° Que contient alors la variable d1 après cet appel ?

    54
    d1 = carre_vide(cr, 50, 20, 100)

    ...CORRECTION...

    La variable d1 va faire référence à la réponse de la fonction. Il faut donc aller voir ce que réponds cette fonction !

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
    from turtle import Turtle def carre_vide(cr, x, y, cote): cr.penup() cr.goto(x,y) cr.pendown() cr.forward(cote) cr.left(90) cr.forward(cote) cr.left(90) cr.forward(cote) cr.left(90) cr.forward(cote) cr.left(90) return cote * 4

    Puisque cote fait référence à 100, on va renvoyer 400.

    3 - Fonction gérant les couleurs

    04° La fonction couleurs dessine-t-elle quelque chose au vu de son code ? Que réalise la fonction couleurs ?

    19 20 21 22 23
    def couleurs(cr, fond, ecriture, taille): cr.pencolor(ecriture) cr.fillcolor(fond) cr.pensize(taille) return 'Le crayon a été modifié'

    ...CORRECTION...

    Cette fonction ne dessine rien.

    Elle modifie simplement les caractéristiques du crayon

    1. La couleur d'écriture en ligne 20
    2. Le fond coloré éventuel en ligne 21
    3. L'épaisseur du trait en ligne 22

    05° Modifier le code suivant dans la fonction maison pour pouvoir :

    1. modifier le crayon pour qu'il écrive en rouge avec une taille de taille 6. Attention, le deuxième paramètre est celui du fond coloré.
    2. dessiner un carré sans fond coloré aux coordonnées 50,100 et avec 75 pixels de côté, avec la fonction carre_vide.
    1 2 3
    def maison(cr): couleurs(crayon, "yellow", "blue", 3) d1 = carre_vide(cr, 0, 0, 150)

    Voici le visuel que vous devrez obtenir après modification :

    Résultat possible
    Le résultat de l'appel précédent

    ...CORRECTION...

    1 2 3
    def maison(cr): couleurs(crayon, "yellow", "red", 6) d1 = carre_vide(cr, 50, 10, 75)

    Pourquoi ? Il suffit d'aller regarder le prototype de la fonction :

    19
    def couleurs(cr, fond, ecriture, taille):

    On a donc bien :

    • cr crayon
    • fond "yellow"
    • ecriture "red"
    • taille 6

    06 - à faire valider° Rajouter deux nouvelles lignes de code pour obtenir approximativement ceci :

    Résultat possible

    Attention, le fond ne pourra pas encore être en jaune, c'est normal.

    Votre fonction maisoin devra contenir 4 lignes de code.

    07° Regarder le code de carre_plein. Quelle va être la seule différence en terme de résultat visuel avec la fonction carre_vide ?

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
    def carre_plein(cr, x, y, cote): cr.penup() cr.goto(x,y) cr.pendown() cr.begin_fill() cr.forward(cote) cr.left(90) cr.forward(cote) cr.left(90) cr.forward(cote) cr.left(90) cr.forward(cote) cr.left(90) cr.end_fill() return cote * 4

    08° Remplacer la fonction maison par celle-ci : on fait appel à couleurs et à carre_plein cette fois. Relancer le programme et observer le résultat :

    1 2 3 4 5 6 7 8 9
    def maison(cr): couleurs(crayon, "red", "darkred", 6) d1 = carre_plein(cr, 0, 0, 80) couleurs(crayon, "lightblue", "blue", 6) d2 = carre_plein(cr, 90, 0, 80) couleurs(crayon, "lightgreen", "green", 6) d3 = carre_plein(cr, 0, 90, 80) couleurs(crayon, "red", "darkred", 6) d3 = carre_plein(cr, 90, 90, 80)
    Résultat possible

    Comment sommes-nous parvenus à tracer 4 carrés de couleurs différentes ?

    Maintenant que vous savez utiliser les fonctions couleurs et carre_plein, voyons comment créer une nouvelle forme en créant une nouvelle fonction :

    09° Compléter la fonction disque(cr, x, y, rayon) qui doit tracer un disque coloré de rayon rayon aux coordonnées x et y.

    1 2 3 4 5 6 7 8
    def disque(cr, x, y, rayon): cr.penup() cr.goto(x,y) cr.pendown() cr.begin_fill() # à vous de remplacer ceci ! cr.end_fill() return 2*3.14*rayon

    Pour tracer un cercle, aller voir le rappel Turtle en début d'activité.

    cr.circle(100) : veut dire de tracer avec un crayon nommé ici cr un cercle de rayon 100 pixels (et d’angle 360°)

    Attention, elle doit renvoyer la distance parcourue par le crayon, en pixels. Pour PI, on pourra prendre simplement 3,14.

    ...CORRECTION...

    1 2 3 4 5 6 7 8
    def disque(cr, x, y, rayon): cr.penup() cr.goto(x,y) cr.pendown() cr.begin_fill() cr.circle(rayon) cr.end_fill() return 2*3.14*rayon

    10- à faire valider° Modifiez maintenant la fonction maison de façon à tracer ceci :

    Résultat possible

    Noter votre code sur votre copie.

    11° Créer la fonction triangle(cr, x, y, cote).

    Attention, elle doit renvoyer la distance parcourue par le crayon, en pixels.

    Vous pouvez vous aider du code de la fonction carre_plein :

    1. Copier-coller le code dans la fonction triangle
    2. Modifier le code : on ne veut pas avancer et tourner 4 fois de 90°
    3. mais on veut avancer et tourner 3 fois de 120°

    Notez votre code sur votre copie.

    12° Fournir le code de la fonction maison permettant de faire cela :

    Résultat possible

    Notez ceci sur votre copie.

    4 - Dessin complexe

    L'un des principes de la programmation est de concevoir des fonctions pour chaque tâche simple (dessiner un carré, un rectangle, un triangle, changer les couleurs...)

    Une fonction pour une tâche.

    Et si on veut faire quelque chose de complexe ? Et bien, il suffit de créer une fonction qui utilise les fonctions simples !

    13° Modifier maintenant le code de la fonction maison(cr) qui utilise le crayon nommé cr reçu via le paramètre pour dessiner automatiquement une facade de maison en respectant les couleurs suivantes :

    • une façade orange (avec couleurs et carre_plein()),
    • La façade orange
      La façade orange

    14° Rajouter d'autres instructions dans la fonction maison de façon à tracer en plus

    • une porte (verte) (avec couleurs et carre_plein())
    • La porte
      La porte verte

    15° Rajouter d'autres instructions dans la fonction maison de façon à tracer en plus

  • plusieurs fenêtres (bleues) (avec couleurs et carre_plein()),
  • Les fenêtres
    Les fenêtres

    16° Rajouter d'autres instructions dans la fonction maison de façon à tracer en plus

    • un toit (rouge) (avec couleurs et triangle()).
    • Le toit
      La maison finale

    17-bonus° Modifier maintenant la déclaration de maison(couleur_facade, couleur_porte) pour qu’elle possède deux paramètres gérant les couleurs : il faudra donc les transmettre lors de l'appel.

    Le toit
    La même maison avec d'autres couleurs

    5 - FAQ

    Pas de question pour le moment

    Activité publiée le 25 02 2021
    Dernière modification : 25 02 2021
    Auteur : ows. h.