Vidéo 10 : Turtle : l’interface¶
Le module Turtle¶
Le langage Logo des années 1960 disposait d’un outil de dessin appelé turtle et destiné à enseigner la programmation aux enfants. La bibliothèque standard de Python ré-implémente cet outil via le module appelé Turtle et qui permet de créer des dessins dans une fenêtre. On peut tracer des lignes droites, des arcs de cercle et effectuer des remplissages (et beaucoup d’autres choses) :
Par défaut, les dessins s’exécutent de manière animée et non instantanée.
Pour se faire une idée, voici le code Python du dessin visible ci-dessus
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 | from turtle import *
def yin(radius, color1, color2):
width(3)
color("black", color1)
begin_fill()
circle(radius/2., 180)
circle(radius, 180)
left(180)
circle(-radius/2., 180)
end_fill()
left(90)
up()
forward(radius*0.35)
right(90)
down()
color(color1, color2)
begin_fill()
circle(radius*0.15)
end_fill()
left(90)
up()
backward(radius*0.35)
down()
left(90)
def main():
reset()
yin(200, "black", "white")
yin(200, "white", "black")
ht()
return "Done!"
main()
exitonclick()
|
On écrit et on exécute le code Turtle ci-dessus comme du code Python habituel. Le code et l’apparition de la fenêtre peuvent légèrement varier en fonction de l’environnement utilisé d’exécution. La zone de la fenêtre où le dessin est visible est souvent appelée un canevas.
Turtle est un module standard de Python et pour l’utiliser, il faut importer Turtle et il est courant de le faire de la manière suivante :
1 | from turtle import *
|
Exécution de Turtle sur le site trinket.io¶
Se rendre sur le site web trinket qui permet d’utiliser le module Turtle à distance.
Écrire (ou copier-coller) le code de démonstration suivant dans l’éditeur en ligne
1 2 3 4 5 6 | from turtle import *
goto(50,150)
goto(200,0)
goto(170,-30)
goto(0,0)
|
puis cliquer sur le bouton Run pour voir le code s’exécuter. Le dessin apparaît dans la fenêtre à droite :
Si le dessin n’est pas complètement visible, agrandir la fenêtre.
Turtle dans une feuille Jupyter version Bureau¶
On peut utiliser le module turtle
avec Jupyter installé localement. En revanche, pour l’instant, les feuilles Jupyter utilisées à distance comme sur le Cloud Azure ne peuvent exécuter du code Turtle.
Quand on exécute un code Turtle valide depuis une cellule, une fenêtre avec le dessin s’ouvre. Cette fenêtre n’appartient pas au navigateur, elle appartient à Tk qui gère l’interface graphique en Python. Si votre code est écrit selon les règles, il vous suffit de cliquer dans la fenêtre pour la refermer.
Quand on exécute du code Turtle dans une feuille de travail Jupyter depuis une installation locale, on peut être confronté à deux difficultés :
- la survenue d’une exception de type
Terminator
- le problème de la fermeture de la fenêtre de dessin
Exception Terminator
¶
Cela semble un bug non résolu de IPython (le moteur des feuilles Jupyter). Une fois sur deux, l’exécution de code Turtle se bloque et apparaît un message d’erreur commençant par le mot Terminator
(une exception Turtle). Si on relance la cellule, l’exception ne réapparaît plus et le code s’exécute. A la prochaine exécution de code, l’exception réapparaîtra et ainsi de suite en alternance.
Par exemple, soit les deux cellules suivantes
1 2 3 | from turtle import *
goto(100, 100)
exitonclick()
|
4 5 6 | from turtle import *
goto(500, 500)
exitonclick()
|
- 0n exécute la première cellule : la fenêtre s’ouvre normalement, le dessin est créé
- On ferme la fenêtre de dessin
- On exécute la cellule en-dessous : la fenêtre ne s’ouvre plus et s’affiche un message d’erreur :
1 2 3 4 5 6 7 8 9 | Terminator
Traceback (most recent call last)
<ipython-input-2-f6e1442437cf> in <module>()
1
----> 2 reset()
3 goto(500, 500)
4 exitonclick()
/usr/lib/python3.4/turtle.py in reset()
Terminator:
|
- On revient sur la cellule, et on lance à nouveau son exécution : cette fois, la fenêtre s’ouvre, le dessin est créé.
Il semblerait que ce soit un bug d’IPython car ce type de code fonctionne sans problème dans d’autres environnements.
Le seul remède est un peu laborieux : il s’agit d’ignorer l’exception avec un bloc try-except
comme dans l’exemple ci-dessous :
1 2 3 4 5 6 7 8 9 10 | from turtle import *
try:
reset()
except Terminator:
pass
goto(100, 100)
goto(200, 0)
exitonclick()
|
- Lignes 2-5 : code pour éliminer la survenue de l’exception bloquante.
- Lignes 7-8 : le code qu’on veut exécuter
- Ligne 10 : en pratique, ligne obligatoire sous IPython.
Fermeture de la fenêtre¶
Placer à la fin du code Turtle une instruction exitonclick()
(avec les parenthèses) ce qui a pour conséquence de fermer définitivement la fenêtre dès qu’on clique dedans ou sur la croix. Si on l’oublie, on ne pourra pas fermer la fenêtre même en cliquant sur la croix.
Que faire si on a oublié de placer exitonclick()
?
Revenir dans la cellule on a tapé le code et à la fin, ajouter la ligne exitonclick()
.
En conclusion, un code utilisant le module turtle
et placé dans une cellule d’entrée d’une feuille Jupyter aura toujours la structure suivante
1 2 3 4 5 6 7 8 9 10 | from turtle import *
try:
reset()
except Terminator:
pass
# Le code de votre dessin
# ICI
exitonclick()
|