16.1.6.4 Associazione tra widget e variabili

Il valore corrente di alcuni widget (come la casella di introduzione di testo) può essere connesso direttamente a variabili dell'applicazione usando speciali opzioni. Queste opzioni sono variable, textvariable, onvalue, offvalue e value. Questo collegamento lavora in entrambe le direzioni: se la variabile, per qualunque motivo, cambia, allora il widget collegato verrà modificato per riflettere il nuovo valore.

Sfortunatamente nell'implementazione corrente di Tkinter non è possibile passare una variabile Python arbitraria ad un widget attraverso l'opzione variable o textvariable. L'unico tipo di variabili che possono svolgere questo lavoro sono variabili che derivano da una classe chiamata Variable, definita nel modulo Tkinter.

Ci sono molte sottoclassi di Variable già definite: StringVar, IntVar, DoubleVar e BooleanVar. Per leggere il valore attuale di una tale variabile, chiamare il suo metodo get() e, per cambiarlo, il metodo set(). Se si segue questo protocollo il widget si adeguerà sempre al valore della variabile senza ulteriori interventi.

Per esempio:

class App(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()
        
        self.entrythingy = Entry()
        self.entrythingy.pack()
        
        self.button.pack()
        # Qui c'è la variabile dell'applicazione
        self.contents = StringVar()
        # Le viene dato un qualche valore
        self.contents.set("this is a variable")
        # Si fa in maniera che il widget di immissione veda questa variabile
        self.entrythingy["textvariable"] = self.contents
        
        # e qui si mette la chiamata ad una funzione quando l'utente preme return.
        # faremo in modo che il programma stampi il valore della
        # variabile dell'applicazione quando l'utente preme return.
        self.entrythingy.bind('<Key-Return>',
                              self.print_contents)

    def print_contents(self, event):
        print "Ciao. Il contenuto della casella di immissione ora è ---->", \
              self.contents.get()

Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.