Saturday, February 8, 2014

Variable wrappers e tracing

Abbiamo visto come il click di un Button possa essere usato, tramite il parametro command, come evento scatenante la chiamata di una funzione, e quindi per causare cambiamenti nelle variabili di istanza o nello stato dei widget. Oltre a questo semplice meccanismo ne esistono altri: il binding, che consente di legare eventi del mouse o della tastiera a specifiche funzioni, e il tracing di classi di variabili, che ci interessa in particolare per il progetto astrologico.

Il binding è semplicissimo. Vi do' un esempio, tratto dal sito effbot.org:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
from Tkinter import *

root = Tk()

def callback(event):
    print "clicked at", event.x, event.y 

frame = Frame(root, width=100, height=100)
frame.bind("<Button-1>", callback)
frame.pack()

root.mainloop()

In questo esempio, la funzione callback è chiamata ogni volta che si clicca con il tasto sinistro del mouse dentro la finestra. Viene passato alla funzione un parametro complesso da cui è possibile ricavare le coordinate relative del mouse.

Gli eventi possibili vanno dalle attività del mouse o della tastiera, alla chiusura delle finestre e altro. Non mi soffermo più di tanto su questi aspetti perchè in questo momento preferisco occuparmi delle 'variable classes'.

In parole semplici, una variabile creata appositamente con le procedure StringVar, IntVar e simili, puo' essere tracciata, in qualche modo monitorata per rilevarne i cambiamenti e attivare funzioni di callback.

Per esempio, se creo una variabile:

var = StringVar

le assegno il tracing facendo riferimento ad una funzione, es self.callback<(p>

var.trace("w", self.callback)

dove "w" sta per scrittura (ci sono anche "r" per lettura e "u" per aggiornamento), e infine la do' come parametro ad una textvariable di un widget:

Widget_generico(textvariable=var)

ogni volta che la variabile verrà cambiata, potro' far scattare il binding con la funzione callback

Per cambiare la variabile non basta assegnarle un nuovo valore come si fa normalmente in Python, bisogna usare un metodo specificatamente previsto da Tkinter, a meno che l'azione del widget non produca da solo l'aggiornamento richiesto:

var.set(nuovo_valore)

per leggerla occorre utilizzare il metodo .get()

mia_variabile=var.get()

tutto questo si rivelerà utile per il nostro progetto, come possiamo già vedere nell'esempio contenuto nel prossimo post.

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...