Binding
Qu'est ce que c'est ???
Création d'un évènement dès que la valeur d'un widget est changée
En plus des évènements usuels présentés ci-avant, on peut vouloir lancer une fonction ou retourner une action dès que la valeur d'un widget est mise à jour. Par exemple, on a une liste déroulante (combobox) et on souhaite qu'une action soit effectuée dès qu'une nouvelle valeur est sélectionnée. Pour se faire, on utilise la fonction suivante sur un widget :
var.trace('w',function)
Avec :
- "var" une variable d'environnement;
- "function" la fonction contenant l'action à effectuer, attention la fonction "trace" passe en paramètres trois valeurs : le nom de la variable (sous forme d'une chaîne de caractères), une variable vide, le mode de traçage ('w' ou 'r');
- 'w', l'action à tracer : 'w', si on veut suivre l'écriture de la variable ou 'r' si on veut suivre sa lecture.
Exemple d'utilisation :
L'exemple présenté ci-après permet de changer le widget présent dans une frame en fonction d'une de la valeur sélectionnée dans une liste.
Pour se faire on commence par créer le widget et lui assigner une variable d'environnement :
from tkinter import *
from tkinter.ttk import *
fen= Tk()
CB_Var=StringVar()
CB_Var.set("entry")
CB=Combobox(fen,values=["entry","button"],textvariable=CB_Var)
CB.state(["readonly"]) #Pour que les valeurs de la liste ne soient pas modifiables
CB.grid(row=1,column=1)
Frm=Frame(fen)
Frm.grid(row=2,column=1)
On appelle ensuite une class, qui contiendra les actions à effectuer :
UpdateWidget(Frm,CB_Var)
On crée ensuite la class correspondante :
class UpdateWidget():
def __init__(self,Frm,CB_Var):
self.Frm=Frm #Stockage de la frame dans la class
self.Var=CB_Var #Stockage de la variable dans la class
self.Var.trace('w',self.Update)
def Update(self,a,b,c):
#a,b,c sont les variables passées en paramètres dans la fonction "trace"
#On commence par nettoyer la frame des widgets qu'elle contient
for w in self.Frm.winfo_children():
w.destroy()
#On ajoute un widget à la frame en fonction de la valeur de Var
if self.Var.get()=="entry":
ent=Entry(Frm)
ent.grid(row=1,column=1)
elif self.Var.get()=="button":
but=Button(Frm,text="Bouton")
but.grid(row=1,column=1)
Le code complet donne :
from tkinter import *
from tkinter.ttk import *
class UpdateWidget():
def __init__(self,Frm,Var):
self.Frm=Frm
self.Var=Var
self.Var.trace('w',self.Update)
def Update(self,a,b,c):
for w in self.Frm.winfo_children():
w.destroy()
if self.Var.get()=="entry":
ent=Entry(Frm)
ent.grid(row=1,column=1)
elif self.Var.get()=="button":
but=Button(Frm,text="Bouton")
but.grid(row=1,column=1)
fen= Tk()
CB_Var=StringVar()
CB_Var.set("entry")
CB=Combobox(fen,values=["entry","button"],textvariable=CB_Var)
CB.state(["readonly"])
CB.grid(row=1,column=1)
Frm=Frame(fen)
Frm.grid(row=2,column=1)
UpdateWidget(Frm,CB_Var)
fen.mainloop()