Friday, February 14, 2014

Terzo intermezzo - duemila magnifiche biglie

Interrompo ancora una volta il lento processo di avvicinamento verso la realizzazione di un software astrologico per parlare, almeno una volta, di classi.

Fino ad ora abbiamo usato le classi come contenitori generali per i widget di Tkinter, situazioni in cui la programmazione per oggetti non era poi così indispensabile, se non per mantenere ordinato il codice e l'accesso alle funzioni.

Ora però vorrei mostrarvi, ancora in ambiente Tkinter, cosa succede quando si generano molte istanze della stessa classe. Nel successivo programma verranno generati, in una Canvas, duemila oggetti circolari, che si muoveranno in modo pseudocasuale, abbastanza browniano, in uno sfondo di colore nero.

Se pensate che Python, essendo un linguaggio interpretato, sia troppo lento, forse questo piccolo programma vi farà ricredere. Nella maggior parte delle situazioni, la velocità non è un problema. Se avete sperimentato la velocità di scansione di un file SVG, potrete forse aver giudicato 'ragionevole' un tempo esecutivo di qualche frazione di secondo.

A proposito di questo programma, voglio farvi solo notare come si usa una stringa 'numerata' per tenere traccia dell'elenco delle sfere, come si genera casualmente il colore di ogni sfera, come viene fatto l'aggiornamento ogni 50 (diciamo almeno ogni 50) millisecondi della canvas, e come è facile usare il metodo 'move' di Canvas per spostare di lunghezze determinate ogni singolo oggetto. Il refresh è automatico, Tkinter/Tcl non è poi' così male, anche qualora volessimo usarlo per produrre un videogame o una simulazione fisica.


import Tkinter
import random

class MyApp:

    def __init__(self):
        self.root = Tkinter.Tk()
        self.frame= Tkinter.Frame()
        self.frame.pack()
        self.width = 1200
        self.height= 1200
        self.canvas = Tkinter.Canvas(self.frame, width=self.width,
                                     height=self.height, background = "black")
        self.canvas.pack()

        for i in range(2000):
            name='myBall'+str(i)
            x1 = random.randrange(self.width)
            y1 = random.randrange(self.height)
            color = "#%02x%02x%02x" % (random.randrange(256),random.randrange(256),random.randrange(256))
            x2 = x1+10
            y2 = y1+10
            self.canvas.create_oval(x1,y1,x2,y2,fill=color, tag = name)
        self.root.after(50,self.move)

    def move(self):
        for i in range(2000):
            xp = random.randrange(-10,11)
            yp = random.randrange(-10,11)
            self.canvas.move('myBall'+str(i),xp,yp)
        self.root.after(50,self.move)


            
    def mainloop(self):
        self.root.mainloop()



app=MyApp()
app.mainloop()

No comments:

Post a Comment

<h1>Magic: Will, Reality and Science</h1>

Conversation between me and Gemini Me: Gemini, let's hypothesize that magic, that is, the art of causing changes in accordance w...