Exporter une image générée par le module turtle sur python

Tutoriels

Il est possible de produire des images à l’aide d’un script python, en exploitant par exemple la bibliothèque turtle de python. Nativement, le module turtle propose un export au format .ps de l’image générée. Ce tutoriel vous permettra d’exporter cette image au format .png

Exporter une image au format .ps

Nativement, le module turtle de python est capable d’exporter une image au format .ps (découvrir le .ps) comme dans l’exemple ci-dessous.

from turtle import *

list1 = ["blue","cyan", "pink", "magenta", "purple"]
for i in range(42) :
  color(list1[i%5])
  pensize(42)
  forward(4*i)
  right(42)
  
image = getcanvas()
image.postscript(file="image.ps", colormode='color')

Cette image est crée puis enregistrée dans le même dossier que celui qui contient le script .py au format .ps

Cette image n’est pas affichée par l’explorateur Windows, il ne gère pas nativement ce format.

Il est possible de l’ouvrir et de la modifier modifiée sous GIMP, et éventuellement de l’exporter au format .png depuis ce logiciel libre.

L’image ouverte dans Gimp

Cette solution présente 4 défauts :

  • Chaque exécution du script va écraser l’image précédente,
  • Le nom du fichier est non pertinent,
  • Le format .ps n’est pas directement utilisable.
  • La taille de l’image n’est pas gérée.

Exporter une image au format .ps avec un nom de fichier défini

from turtle import *

# Uniquement des lettres, des chiffres, un tiret. Rien d'autre.
titre = "Spirale - construite avec turtle"

# Définir le titre de la fenêtre de turtle + propagande ^^
title(titre+" | Au lycée, la meilleure spécialité, c'est la spé NSI")

list1 = ["blue","cyan", "pink", "magenta", "purple"]
for i in range(42) :
  color(list1[i%5])
  pensize(42)
  forward(4*i)
  right(42)
  
image = getcanvas()
image.postscript(file=titre+".ps", colormode='color')

La fenêtre turtle à désormais un titre :

Ce titre est exploité pour générer un fichier correctement nommé :

On va maintenant ajouter un identifiant, presque unique pour que les images ne s’écrasent pas.

from turtle import *
from datetime import datetime

# Uniquement des lettres, des chiffres, un tiret. Rien d'autre. https://learn.microsoft.com/fr-fr/windows/win32/fileio/naming-a-file
titre = "Spirale - construite avec turtle"

# Définir le titre de la fenêtre de turtle + propagande ^^
title(titre+" | Au lycée, la meilleure spécialité, c'est la spé NSI") 

list1 = ["blue","cyan", "pink", "magenta", "purple"]
for i in range(42) :
  color(list1[i%5])
  pensize(42)
  forward(4*i)
  right(42)
  
image = getcanvas()
nom_du_fichier=titre+"_"+hex(datetime.now().microsecond)+".ps"
image.postscript(file=nom_du_fichier, colormode='color')

L’image sera générée aura un identifiant presque unique, codée en base 16.
Après réflexion, un nombre aléatoire généré par le module random aurait été préférable et plus simple 🤔

Si les deux dernières lignes sont exécutés trois fois, on obtient 3 images (identiques) mais ayant chacune un identifiant unique.

Remarque : Il est possible, que parfois une une nouvelle image écrase une précédente, mais la probabilité est faible.

Exporter une image au format .png avec une résolution cible

Pour exporter également les images au format .png, on va avoir besoin du module PILLOW de python et de ghostscript.

  1. Installer ghostscript : https://ghostscript.com/releases/gsdnld.html
  2. Installer PIL, sous Thonny
    Outil > Ouvrir la console système> pip install pillow
  3. Redémarrer l’ordinateur.
  4. Redémarrer Thonny. (ceinture + bretelle 😩)
    Outil > Ouvrir la console système > pip show PILLOW
    Vous devriez voir la version de PIL affichée

Le script final spécifie le format de l’image (ici en 720p), génère le fichier au format .ps et le fichier au format .png.

from turtle import *
from random import randint
from PIL import Image

# Uniquement des lettres, des chiffres, un tiret. Rien d'autre. https://learn.microsoft.com/fr-fr/windows/win32/fileio/naming-a-file
titre = "Spirale - construite avec turtle"

# Définir le titre de la fenêtre de turtle + propagande ^^
title(titre+" | Au lycée, la meilleure spécialité, c'est la spé NSI")

# definir la taille de la fenêtre en 720p (Largeur, Hauteur, abscisse départ, ordonnée du départ)
setup(1280, 720, 0, 0) 

# ============== MON SCRIPT PYTHON ==============

list1 = ["blue","cyan", "pink", "magenta", "purple"]
for i in range(2*42) :
  color(list1[i%5])
  pensize(42)
  forward(4*i)
  right(42)  

# ============== GENERER DES IMAGES AUTOMATIQUEMENT ==============

image = getcanvas()
nom_du_fichier_sans_extension=titre+"_"+hex(randint(2**30+2**25,2**30+2**25+2**24-1))[2:]

# Génère un fichier .ps
image.postscript(file=nom_du_fichier_sans_extension+".ps", colormode='color')

# Ouvre le fichier .ps et génère le fichier .png
psimage = Image.open(nom_du_fichier_sans_extension+".ps")
psimage.save(nom_du_fichier_sans_extension+".png")

A noter : Pour l’instant l’export ne respecte pas la résolution imposée (720p), l’image générée fait 959 par 540 pixels. Des investigations sont en cours pour comprendre le problème.

Un fichier .py qui gère les erreurs

Les élèves ne lisent pas les tutoriels, ils préfèrent appeler l’enseignant car « cela ne marche pas ».
Le fichier .py ci-dessous gérera ce problème et les deux erreurs classiques probables.
Si l’élève n’a pas suivi le tuto ou qu’il n’a pas réussi à installer les modules requis, l’image .png ne sera pas générée mais le script ne plantera pas.

try, except pour une gestion propre des plantages.

try:
    from PIL import Image
    pillow_installed = True
except:
    print("Oops! - ModuleNotFoundError: No module named 'PIL' - RTFM :")
    print("https://nsi.xyz/py2png")
    pillow_installed = False

Rudiments pour le module turtle

A lire ici : Découvrir le module turtle de python

Support technique

Aucun support technique ne sera assuré concernant ce tutoriel.

En cas de problème, vous pouvez toujours répondre à ce message sur twitter mais sans garantie de réponse 😉

One More Thing

Le code final formate le nom du fichier avec

randint(2**30+2**25,2**30+2**25+2**24-1)

Pourquoi 230+225 ?

Evolution à prévoir en 2023

1. Générer les images à l’aide d’une fonction, afin de pouvoir l’appeler à plusieurs moments, utile pour écrire l’article de présentation.

2. Intégrer ceci :

Tester ceci (aussi dans un mail reçu le 13 nov. 2022 09:50)