Tutoriel de turtle ( )
PRESENTATION DU MODULE TURTLE.
Le module turtle simule le déplacement d'une tortue virtuelle, dont la trace crée des figures et des graphismes.
turtle est un module de la bibliothèque standard de Python 3. Il est donc toujours disponible.
GENERALITES.
Les tortues sont des objets anciens, Les tortues graphiques sont des objets des débuts de l'informatique grand publique. Elles étaient présentens dans le langage de programmation logo et avaient comme vocation première d'être, avant tout, un moyen d'initier les débutants à la programmation et à sa philosophie analytique.
Les tortues graphiques proposées dans le module turtle, de la bibliothèque standard Python, ont gardé cette aspect pédagogique d'accès à la programmation, et c'est surtout comme cela qu'il convient de les utiliser. Même si ses capacités, de dessin, semblent intéressantes pour d'autres usages, les objets graphiques proposés par le module turtle ne seront jamais aussi riches que ceux proposé dans des modules spécialisés en dessin.
Le module turtle de la bibliothèque standard de Python, inspiré du livre "Tkinter" de Grayon, est entièrement créer à l'aide du module tkinter. Les tortues graphiques évoluent dans un objet de la classe turtle.ScrolledCanvas ( ), qui associe à une instance tkinter.Canvas ( ) des objets tkinter.Scrollbar ( ). Ainsi le module turtle utilise pleinement les objets et méthodes graphiques, et plusieurs méthodes communes, de tkinter.
Bien qu'elles aient les mêmes possibilités de tracés, dans le module turtle on peut distinguer 3 types de tortues graphiques.
Si l'application ne doit utiliser qu'une seule tortue, et l'on s'efforcera de rester dans ce cas, on utilisera la tortue anonyme (turtle.) du module turtle. Cette tortue anonyme peut appelez les méthodes des classes TurtleScreen ( ) et RawTurtle ( ) directement. Par exemple : turtle.forward ( 100 ), pour faire avancer la tortue de 100 pas ou turtle.title ( "Mon titre" ), pour modifier le titre de la fenêtre.
Si l'application ne doit utiliser plusieurs tortues, en particulier pour des effets visuels ou pour réaliser des figures indépendantes, il faudra alors créer autant de tortues nommées que nécessaires, avec la classe turtle.Turtle ( ) (TOR_MaTortueA = turtle.Turtle ( )), mais dans ce cas, chaque tortue peut appeler les méthodes de la classe turtle.RawTurtle ( ) directement (ex.: TOR_MaTortueA.forward ( 100 ), pour faire avancer la tortue de 100 pas ) ; mais doit préfixer les méthode de la classe turtle.TurtleScreen ( ) de .screen ( ) (ex.: TOR_MaTortueA.screen.title ( "Mon titre" ), pour modifier le titre de la fenêtre.
Si la tortue graphique doit être insérer dans une toile, ou canvas, d'une autre interface, de tkinter par exemple, il faut alors créer une instance de la classe turtle.RawTurtle ( toile ), où toile est l'identifiant de la toile créer avec la classe turtle.ScrolledCanvas ( ), où dessinera la tortue graphique, pour obtenir une tortue graphiques indépendante mais nommée.
A noter que la tortue anonyme est une instance de la turtle ( ), sous classe de turtle.Turtle ( ), qui est elle-même unee sous-classe de turtle.RawTurtle ( ). Et que turtle.RawPen ( ) est l'ancien nom de la classe turtle.RawTurtle ( ) et reste son alias, de même que turtle.Pen ( ) est l'ancien nom de la classe turtle.Turtle ( ) et reste son alias.
En effet, lors du premier appel d'une méthode comprise dans le module turtle, par la tortue anonyme ou une tortue nommée, une instance de la classe turtle.ScrolledCanvas ( ) est créée pour faire évoluer cette tortue, mais elle doit être volontairement instanciée pour l'associer à une tortue indépendante. Les paramètre par défaut du canvas sont turtle.ScrolledCanvas ( master , width = 500 , height = 350 , canvwidth = 600 , canvheight = 500 ).
DESSIN BASIC AVEC LA TORTUE ANONYME.
import turtle # 01. Importer l'intégralité du module turtle.
turtle.forward ( 100 ) # 02. Faire avancer la tortue de 100 pas.
turtle.backward ( 40 ) # 03. reculer la tortue de 40 pas.
turtle.right ( 90 ) # 04. Faire pivoter la tortue de 90 degrés vers la droite.
turtle.forward ( 25 ) # 05. Faire avancer la tortue de 25 pas.
turtle.penup ( ) # 06. Faire lever le crayon de la tortue.
turtle.goto ( 30 , 80 ) # 07. Faire aller la tortue au points (30,80).
turtle.pendown ( ) # 08. Faire baisser le crayon de la tortue.
turtle.left ( 45 ) # 09. Faire pivoter la tortue de 45 degrés vers la gauche.
turtle.forward ( 150 ) # 10. Faire avancer la tortue de 150 pas.
turtle.backward ( 60 ) # 11. Faire reculer la tortue de 60 pas.
# 01 : demande au programme d'importer l'intégralité du module turtle ( import turtle ).
On importe, dans le script, toutes les classes et méthodes du module turtle de la bibliothèque standard. Le nom du module n'est pas changé, il faudra dont faire préfixer les noms de classes et de méthodes de turtle. pour les utiliser sans lever d'exception.
# 02 : demande à la tortue anonyme d'avancer de 100 pixels ( turtle.forward ( 100 ) ).
La méthode .forward ( 100 ) fait avancer la tortue appelante de 100 pas, ici des pixels, vers l'avant, ici vers le bord droit de la toile, en laissant une trace sur la toile. La notion de vers l'avant est un point important dans les dessins à l'aide de tortues. En effet, la direction de la tortue varie en fonction des commandes données par le programme. On ne fait référence à aucune tortue en particulier pour cet appel, Python le lie à la tortue anonyme du module turtle. Comme une tortue dit évoluer sur une surface de dessin, dite canvas ou toile, Python créer cette toile, avec des paramètres par défauts fournis par le module turtle, pour pouvoir exécuter la commande demandée par le script.
# 03 : demande à la tortue anonyme de reculer de 40 pixels ( turtle.backward ( 40 ) ).
La méthode .backward ( 40 ) fait reculer la tortue appelante de 40 pas, sans changer l'orientation de la tortue, elle fait 40 pas en marche arrière, en laissant une trace sur la toile. Ici, la direction vers l'avant de la tortue reste vers le bord droit de la toile. On ne perçoit pas la trace car elle est confondue avec la trace précédente, mais elle est bien réalisée.
# 04 : demande à la tortue anonyme de pivoter de 90 degrés vers la droite ( turtle.right ( 90 ) ).
La méthode .right ( 90 ) fait pivoter la tortue appelante de 90 degrés vers la droite. L'orientation de la tortue est influencée par cette instruction. La direction vers l'avant de la tortue est maintenant vers le bord inférieur de la toile. Tous nouveaux déplacements de la tortue iront vers le bas de l'écran, jusqu'à qu'une nouvelle instruction de pivotement soit exigé par le programme.
# 05 : demande à la tortue anonyme d'avancer de 25 pixels ( turtle.forward ( 25 ) ).
La méthode .forward ( 25 ) fait avancer la tortue appelante de 25 pas, vers l'avant, maintenant vers le bas de la toile, puisque l'instruction précédente à fait tourner la tortue dans ce sens, et en laissant une trace sur la toile.
# 06 : demande à la tortue anonyme de lever son marqueur ( turtle.penup ( ) ).
La méthode .penup ( ) fait lever le crayon, ou marqueur de la tortue appelante. Tant que cette commande reste valable, les déplacements de la tortue appelante ne laisseront plus de trace sur la toile.
# 07 : demande à la tortue anonyme de se déplacer jusqu'au coordonnées (30,80) de la toile ( turtle.goto ( 30 , 80 ) ).
La méthode .goto ( 30 , 80 ) fait déplacer la tortue appelante de sa position courante au point, ou pixel, de al toile ayant pour coordonnées (30,80). Si le crayon de la tortue avait été baissé, ce déplacement aurait laissé une trace sur la toile.
# 08 : demande à la tortue anonyme anonyme de baisser son marqueur ( turtle.pendown ( ) ).
La méthode .pendown ( ) fait baisser le crayon, ou marqueur de la tortue appelante. Tant que cette commande reste valable, les déplacements de la tortue appelante laisseront une trace sur la toile.
# 09 : demande à la tortue anonyme de pivoter de 45 degrés vers la droite ( turtle.left ( 45 ) ).
La méthode .left ( 45 ) fait pivoter la tortue appelante de 45 degrés vers la gauche. L'orientation de la tortue est influencée par cette instruction. La direction vers l'avant de la tortue est maintenant vers le coin en bas et à droite de la toile. Tous nouveaux déplacements de la tortue iront vers ce point de l'écran, jusqu'à qu'une nouvelle instruction de pivotement soit exigé par le programme.
# 10 : demande à la tortue anonyme d'avancer de 150 pixels ( turtle.forward ( 150 ) ).
La méthode .forward ( 150 ) fait avancer la tortue appelante de 150 pas, vers l'avant.
# 11 : demande à la tortue anonyme de reculer de 60 pixels ( turtle.forward ( 60 ) ).
La méthode .backward ( 60 ) fait reculer la tortue appelante de 60 pas, sans changer de direction. On peut voir qu'à la fin du script, la flèche, symbolisant la tortue pointe vers le coin de l'écran. Pour s'en rendre compte, il suffit d'ajouter une douzième ligne au script tel que, par exemple, turtle.left ( 56 ) pointe vers ou turtle.left ( 247 ), observer que l'appel de la méthode turtle.forward ( ) ne fait pas pivoter la tortue de 180 degrés.
DESSIN AVEC LA SOURIS POUR DEPLACER LA TORTUE ANONYME.
Le module turtle dispose d'un gestionnaire d'événements, c'est-à-dire un mécanisme interne qui surveille certaines actions, au clavier ou à la souris, de l'utilisateur quand l'application utilisant une tortue à le focus. Si un e ces événement survient, et qu'il est sous surveillance active, l'exécution du programme sera dirigée vers la fonction personnalisée, ou tout autre instruction ou méthode, indiquée dans le script.
import turtle # 01. Importer l'intégralité du module turtle.
def FNC_Dessiner ( Qabscisse , Qordonnee ) : # 031. Le bouton gauche de la souris a été relaché.
turtle.pendown ( ) # 032. Baisser le crayon de la souris anonyme.
turtle.goto ( Qabscisse , Qordonnee ) # 033. Déplacer la tortue au coordonnées de la souris.
def FNC_Effacer ( ) : # 061. La touche espace du clavier a été relachée.
turtle.clear ( ) # 062. Effacer toutes les traces de la tortue anonyme.
turtle.penup ( ) # 063. Lever le crayon de la souris anonyme.
turtle.home ( ) # 064. Déplacer la tortue au centre de la toile.
def FNC_Quitter ( ) : # 071. La touche entrée du clavier a été relachée.
turtle.bye ( ) # 072. Quitter le programme.
def FNC_Sauter ( Qabscisse , Qordonnee ) : # 051. Le bouton droit de la souris a été relaché.
turtle.penup ( ) # 052. Lever le crayon de la souris anonyme.
turtle.goto ( Qabscisse , Qordonnee ) # 053. Déplacer la tortue au coordonnées de la souris.
turtle.home ( ) # 02. Faire apparaitre la toile avec la tortue anonyme au centre.
turtle.Screen ( ).onclick ( FNC_Dessiner , 1 , True ) # 03. Surveiller le bouton gauche de la souris.
turtle.Screen ( ).onclick ( lambda *event : turtle.home ( ) , 2 , True ) # 04. Surveiller le bouton centrale de la souris.
turtle.Screen ( ).onclick ( FNC_Sauter , 3 , True ) # 05. Surveiller le bouton droit de la souris.
turtle.Screen ( ).onkey ( FNC_Effacer , "space " ) # 06. Surveiller la touche espace du clavier.
turtle.Screen ( ).onkey ( FNC_Quitter , "Return" ) # 07. Surveiller la touche entrée du clavier.
turtle.Screen ( ).listen ( ) # 08. Lancer le gestionnaire d'événements du clavier sur la toile.
turtle.mainloop ( ) # 09. Lancer le gestionnaire d'événements de la souris sur la toile.
Pour plus de détails sur chaqu'une des méthodes utilisées, rendez-vous sur la page qui lui est consacrée.
INSERER UNE TORTUE DANS CONTENEUR TKINTER.
Comme précisé plus haut, le module turtle n'est qu'une émanation de la classe tkinter.Canvas ( ). Il est donc aisé inclure des tortues graphiques dans une fenêtre, ou autre conteneur, de tkinter, et de lui adjoindre des controles pour personnaliser le comportement de la tortue. Notez cependant qu'il serait préférable de ce passer de tortue graphique et d'utiliser directement les fonctions graphiques disponibles dans tkinter, car ce sont globalement les mêmes. L'exemple suivant est surtout le prétexte de présenter certaines des méthodes les plus utiles du module turtle, et qui ne sont pas présents dans les exemples précédents.
La toile, où évoluera la tortue graphique, doit être une instance de la classe turtle.ScrolledCanvas ( ), qui est un tkinter.Canvas ( ) conventionnel augmenté de certaines méthodes et fourni dans le module turtle. La tortue graphique, elle, doit être une instance de la classe turtle.RawTurtle ( ).
# --- Importation des modules utiles ---
import tkinter
import turtle
# --- Définition des fonctions anonymes personnalisées ---
LMD_Centrer = lambda : TOR_Tortue.home ( )
LMD_Dessiner = lambda : TOR_Tortue.pendown ( ) if TKV_Trace.get ( ) else TOR_Tortue.penup ( )
LMD_Effacer = lambda : TOR_Tortue.clear ( )
LMD_Epaisseur = lambda event : TOR_Tortue.pensize ( int ( event ) )
LMD_Toile = lambda : TOR_Tortue.screen.bgcolor ( SPI_Toile.get ( ) )
LMD_Trace = lambda : TOR_Tortue.pencolor ( SPI_Trace.get ( ) )
LMD_Vitesse = lambda event : TOR_Tortue.speed ( int ( event ) )
# --- Création des controles de l'interface ---
TKI_Principal = tkinter.Tk ( )
TKV_Trace = tkinter.BooleanVar ( )
BUT_Quitter = tkinter.Button ( TKI_Principal , text = "Quitter" , command = TKI_Principal.destroy )
BUT_Effacer = tkinter.Button ( TKI_Principal , text = "Effacer les traces." , command = LMD_Effacer )
BUT_Centrer = tkinter.Button ( TKI_Principal , text = "Centrer la tortue." , command = LMD_Centrer )
SCA_Epaisseur = tkinter.Scale ( TKI_Principal , orient = "horizontal" , to = 10 , command = LMD_Epaisseur )
SCA_Vitesse = tkinter.Scale ( TKI_Principal , orient = "horizontal" , to = 10 , command = LMD_Vitesse )
SPI_Trace = tkinter.Spinbox ( TKI_Principal , width = 8 , wrap = True , command = LMD_Trace )
SPI_Toile = tkinter.Spinbox ( TKI_Principal , width = 8 , wrap = True , command = LMD_Toile )
CKB_Dessiner = tkinter.Checkbutton ( TKI_Principal , text = "Trace" , variable = TKV_Trace , command = LMD_Dessiner )
CAN_Toile = turtle.ScrolledCanvas ( TKI_Principal , width = 800 , height = 600 , canvwidth = 1600 , canvheight = 1200 )
# --- Placement des controles de l'interface ---
CAN_Toile.grid ( row = 0 , column = 0 , columnspan = 10 )
tkinter.Label ( TKI_Principal , text = "Epaisseur de la trace : " ).grid ( row = 1 , column = 0 , sticky = "se" )
SCA_Epaisseur.grid ( row = 1 , column = 1 , sticky = "nesw" )
tkinter.Label ( TKI_Principal , text = "Couleur de la trace : " ).grid ( row = 1 , column = 2 , sticky = "se" )
SPI_Trace.grid ( row = 1 , column = 3 , sticky = "sw" )
tkinter.Label ( TKI_Principal , text = "Couleur de la toile : " ).grid ( row = 1 , column = 4 , sticky = "se" )
SPI_Toile.grid ( row = 1 , column = 5 , sticky = "sw" )
CKB_Dessiner.grid ( row = 1 , column = 6 , sticky = "sw" )
tkinter.Label ( TKI_Principal , text = "Vitesse de déplacement : " ).grid ( row = 2 , column = 0 , sticky = "se" )
SCA_Vitesse.grid ( row = 2 , column = 1 , sticky = "nesw" )
BUT_Effacer.grid ( row = 2 , column = 2 , columnspan = 2 , sticky = "nesw" )
BUT_Centrer.grid ( row = 2 , column = 4 , columnspan = 2 , sticky = "nesw" )
BUT_Quitter.grid ( row = 2 , column = 6 , sticky = "nesw" )
# --- Création d'une tortue indépendante ---
TOR_Tortue = turtle.RawTurtle ( CAN_Toile )
TOR_Tortue.shape ( "turtle" )
# --- Gestion des événements sur la tortue ---
TOR_Tortue.screen.onclick ( lambda *event : TOR_Tortue.goto ( *event ) , 1 , True )
# --- Mise à jour des controles de l'interface ---
SPI_Trace [ "values" ] = ( "black" , "red" , "lime" , "yellow" , "blue" , "white" )
SPI_Toile [ "values" ] = ( "white" , "pink" , "palegreen" , "cornsilk" , "cyan" , "black" )
SCA_Vitesse.set ( 6 )
CKB_Dessiner.select ( )
# --- Lancement de la surveillance des événement ---
TOR_Tortue.screen.mainloop ( )
TKI_Principal.mainloop ( )
Pour plus de détails sur chaqu'une des méthodes utilisées, rendez-vous sur la page qui lui est consacrée.
Votre aide est précieuse pour améliorer ce site, alors n'hésitez pas à faire part de
Dans la LOGITHEQUE de MON PYTHON PAS A PAS
vous trouvez des suggestions de projets simples et classiques pour
ooo
TESTER - DÉCOUVRIR - PRATIQUER - APPROFONDIR - EXPLORER
ooo
la programmation récréative avec le langage PYTHON 3
avec un exemple de résolution à télécharger pour vous inspirer.