Un tutorial per disegnare con Python opere d’arte moderna

Introduzione

In questo progetto ti insegneremo a disegnare con Python una tua opera d’arte moderna, utilizzando il Microninja. Userai le funzioni per scrivere un codice che potrai usare in maniera ricorsiva.

Usare IDE su Microninja

Un fantastico modo di scrivere e testare codice è quello di usare Thonny Python IDE, un’applicazione di sviluppo per Python.
Lancia Thonny Python IDE da Menu/Coding/Thonny Python IDE.
Si accede al menù facendo clic sull’icona di Microninja in basso a sinistra dello schermo.
Una volta aperta la finestra di Python, avrai a disposizione un editor di testo, dove puoi scrivere, salvare e testare il tuo codice.

Salva subito il tuo file con il nome modernart.py: fai clic su File e quindi su Save As. Seleziona la cartella .thonny, e scrivi modernart.py nel campo di testo Nome del file. Fai quindi clic su Salva.

Colori casuali

Utilizziamo il modulo turtle per creare una tartaruga di un colore a scelta, definendo valori di rosso, verde e blu compresi fra 0 e 255. Per farlo, scrivi il codice seguente:

from turtle import *

shape(“turtle”)
tartaruga = Turtle()
sfondo = Screen()

sfondo.colormode(255)

color(150,0,150)

Salva e lancia il programma e vedi cosa succede.
Abbiamo creato una tartaruga viola, mischiando i colori rosso e blu.

Prova a scegliere dei valori diversi per cambiare il colore della tartaruga.

Puoi fare in modo che il colore della tartaruga venga scelto in maniera casuale definendo e usando la funzione coloreacaso():

from turtle import *
from random import *

shape('turtle')

tartaruga = Turtle()
sfondo = Screen()

sfondo.colormode(255)

def coloreacaso():
    rosso = randint(0, 255)
    verde = randint(0, 255)
    blu = randint(0, 255)
    color(rosso, verde, blu)
coloreacaso()

Lancia il programma e vedi cosa succede.

Posizione casuale

Creiamo ora una funzione che ci permetta di far apparire la tartaruga in una posizione casuale, e non al centro, dove viene posta di default.

Definiamo a tal fine la funzione posizioneacaso():

from turtle import *
from random import *

shape('turtle')

tartaruga = Turtle()
sfondo = Screen()

sfondo.colormode(255)

def coloreacaso():
    rosso = randint(0, 255)
    verde = randint(0, 255)
    blu = randint(0, 255)
    color(rosso, verde, blu)
coloreacaso()

def posizioneacaso():
    x = randint(-100, 100)
    y = randint(-100, 100)
    goto(x, y)
posizioneacaso()

Salva e lancia il programma per vedere cosa succede:
Possiamo fare in modo che il programma per disegnare con Python venga eseguito una seconda volta aggiungendo in fondo:

stamp()

coloreacaso()
posizioneacaso()
stamp()

Salva e lancia il programma.
Come puoi vedere, la tartaruga non si è limitata a spostarsi in modo casuale, ma ha anche tracciato una riga.
Possiamo evitare che succeda? Sì, usando le funzioni penup() e pendown(). Queste funzioni ci permettono infatti di arrivare in un punto del “foglio” senza tracciare alcuna riga… proprio come faremmo nella realtà con una matita in mano…
Inseriamole dunque in apertura e chiusura della definizione posizioneacaso():

def posizioneacaso():
    penup()
    x = randint(-100, 100)
    y = randint(-100, 100)
    goto(x, y)
    pendown()
posizioneacaso()

Salva e lancia il programma.

Eseguilo più per essere sicura di ottenere sempre risultati diversi.
Ora abbiamo due tartarughe di colore casuale in due posizioni casuali.

Turtle art

Sei in grado di definire una funzione rotazioneacaso() che faccia girare la tartaruga in una direzione a caso in modo da far funzionare il codice seguente?

shape(‘turtle’)

for i in range(30):
    coloreacaso()
    posizioneacaso()
    rotazioneacaso()
    stamp()

Suggerimenti:

  • la funzione setheading(numero) ti permette di far ruotare la tartaruga di un angolo pari a numero
  • numero può assumere un valore compreso fra 0 e 360 (i gradi di un cerchio)
  • puoi usare randint(0,360) per scegliere a caso un numero compreso fra 0 e 360


Soluzione:

from turtle import *
from random import *

shape('turtle')

sfondo = Screen()

sfondo.colormode(255)

def coloreacaso():
    rosso = randint(0, 255)
    verde = randint(0, 255)
    blu = randint(0, 255)
    color(rosso, verde, blu)

def posizioneacaso():
    penup()
    x = randint(-100, 100)
    y = randint(-100, 100)
    goto(x, y)
    pendown()

def rotazioneacaso():
    rotazione = randint(0, 360)
    setheading(rotazione)

for i in range(30):
    coloreacaso()
    posizioneacaso()
    rotazioneacaso()
    stamp()

Arte moderna con i rettangoli

Creiamo un’opera d’arte moderna disegnando molti rettangoli di diversi colori e misure.

Per prima cosa aggiungi il codice seguente al programma che hai scritto:

clear()
setheading(0)

Cancellerà tutte le tartarughe che hai disegnato e farà guardare la tartaruga nella direzione originaria (e cioè con un angolo di rotazione uguale a 0).
Per evitare che il codice venga eseguito, puoi renderlo commento. Potrai sempre riattivarlo in seguito per mostrare tutto il lavoro che hai svolto:

#for i in range(30):
#    coloreacaso()
#    posizioneacaso()
#    rotazioneacaso()
#    stamp()

Nota come non sia necessario rendere commento tutte le righe di codice, ma solo quelle che creano l’”azione”.

Ed ora, creiamo la funzione disegnarettangolo(): che disegni un rettangolo di colore, dimensione, e posizione casuale:

def disegnarettangolo():
    hideturtle()
    lunghezza = randint(10, 100)
    altezza = randint (10, 100)
    begin_fill()
    forward(lunghezza)
    right(90)
    forward(altezza)
    right(90)
    forward(lunghezza)
    right(90)
    forward(altezza)
    right(90)
    end_fill()

In fondo al programma aggiungiamo:

disegnarettangolo()

per richiamare la funzione.

Salva il programma e lancialo più volte per vedere come funziona.
Avrai notato che il rettangolo è sempre dello stesso colore e viene disegnato sempre a partire dalla stessa posizione.
Per cambiare posizione e colore dobbiamo richiamare le funzioni posizioneacaso() e coloreacaso() che abbiamo definito in precedenza. Inseriamole all’inizio della definizione della funzione disegnarettangolo()::

def disegnarettangolo():
    coloreacaso()
    posizioneacaso()
    hideturtle()
    lunghezza = randint(10, 100)
    altezza = randint (10, 100)
    begin_fill()
    forward(lunghezza)
    right(90)
    forward(altezza)
    right(90)
    forward(lunghezza)
    right(90)
    forward(altezza)
    right(90)
    end_fill()

Lancia il programma qualche volta per vedere il risultato.
Adesso inseriamo la funzione in un loop e creiamo un’opera d’arte moderna!

from turtle import *
from random import *

shape('turtle')

sfondo = Screen()

sfondo.colormode(255)

def coloreacaso():
    rosso = randint(0, 255)
    verde = randint(0, 255)
    blu = randint(0, 255)
    color(rosso, verde, blu)

def posizioneacaso():
    penup()
    x = randint(-100, 100)
    y = randint(-100, 100)
    goto(x, y)
    pendown()

def rotazioneacaso():
    rotazione = randint(0, 360)
    setheading(rotazione)

#for i in range(30):
#    coloreacaso()
#    posizioneacaso()
#    rotazioneacaso()
#    stamp()
    
clear()
setheading(0)

def disegnarettangolo():
    coloreacaso()
    posizioneacaso()
    hideturtle()
    lunghezza = randint(10, 100)
    altezza = randint (10, 100)
    begin_fill()
    forward(lunghezza)
    right(90)
    forward(altezza)
    right(90)
    forward(lunghezza)
    right(90)
    forward(altezza)
    right(90)
    end_fill()

for i in range(20):
    disegnarettangolo()

Lancia questo programma e ammira il risultato!
Hai notato come sia stata lenta la costruzione dell’opera?
Rendiamola un po’ più veloce.
Sotto shape('turtle') scrivi:

speed(0)

Questa funzione controlla la velocità, che può andare da 0 a 10 (dove 0 indica la velocità massima raggiungibile).

Lancia il programma e osserva la differenza rispetto a prima.

Esercizio

Sei in grado di creare una nuova funzione che che disegna una forma e fa uso delle funzioni coloreacaso() e/o posizioneacaso() che hai creato in precedenza?

Come abbiamo appena fatto, puoi inserire la tua nuova funzione in un loop for per creare la tua opera d’arte.

Suggerimento: in Turtle esiste la funzione dot() che ti permette di disegnare un cerchio. Il suo argomento è il raggio del cerchio. Un esempio è:

tartaruga.dot(10)

Potresti usarla per definire una funzione disegnauncerchio() e costruire una nuova opera fatta di cerchi!
Il codice che abbiamo usato è il seguente:

from turtle import *
from random import *

speed(0)

tartaruga = Turtle()
sfondo = Screen()

sfondo.colormode(255)

def coloreacaso():
    rosso = randint(0, 255)
    verde = randint(0, 255)
    blu = randint(0, 255)
    tartaruga.color(rosso, verde, blu)

def posizioneacaso():
    tartaruga.penup()
    x = randint(-100, 100)
    y = randint(-100, 100)
    tartaruga.goto(x, y)
    tartaruga.pendown()

def disegnauncerchio():
    hideturtle()
    raggio = randint(10, 100)
    tartaruga.dot(raggio)

for i in range(50):
    coloreacaso()
    #tartaruga.penup()
    posizioneacaso()
    #tartaruga.pendown()
    disegnauncerchio()

Ora che sai disegnare con Python, puoi scatenare la creatività e realizzare le tue opere d’arte moderna sfidando gli amici: quale sarà la tua prossima creazione?


This learning resource is provided for free by the Raspberry Pi Foundation under a Creative Commons licence.
Find more at raspberrypi.org/resources and github.com/raspberrypilearning.