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

How to create a virtual linux machine with qemu under Debian or Ubuntu with near native graphics performance

It's been a long time since my latest post. I know, I'm lazy. But every now and then I like to publish something that other people c...