1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
| import tkinter as tk
class LabelListe(tk.LabelFrame):
def __init__(self,maitre,nombre,selection,**arg):
arg['text']='Contient une Listebox'
arg['bg']='Gray90'
arg['fg']='Black'
arg['takefocus']=1
# Création du LabelFrame contenat le widget Listbox
super(LabelListe,self).__init__(maitre,arg)
self.nombre=nombre
self.selectionne=selectionne
self.grid()
# Création de la Listebox
self.lb=tk.Listbox(self,height=5,width=10,
highlightcolor="blue",highlightthickness=2)
self.lb.grid(row=0,column=0,sticky="ns")
self.lb.insert(tk.END,*range(0,30))
# Le focus est donné à la Listbox quand le curseur
# entre dans le LabelFrame et il lui est enlevé quand
# on sort du LabelFrame en le donnant à maitre
self.bind('<Enter>',lambda evt:self.lb.focus_set())
self.bind('<Leave>',lambda evt:maitre.focus_set())
# Création du widget Scrollbarr associé à la Listebox
self.sb=tk.Scrollbar(self)
self.sb.grid(row=0,column=1,sticky="ns")
# Mise en relation de la Listebox et du Scrollbar
self.lb["yscrollcommand"]=self.sb.set
self.sb["command"]=self.lb.yview
self.lb.bind('<<ListboxSelect>>',lambda evt: self.selectionListe(evt))
def selectionListe(self,evt):
if (cs:=self.lb.curselection()):
val=int(cs[0])
if val!=self.selectionne.get():
self.nombre.set(val)
def MaJ(self,*arg): # l'argument *arg est obligatoire pour l'utilisation de trace_add
if (val := self.nombre.get()) != self.selectionne.get():
self.lb.selection_clear(0, tk.END)
self.lb.selection_set(val)
self.lb.see(val)
self.lb.activate(val)
class LabelAfficheur(tk.LabelFrame):
def __init__(self,maitre,nombre,selection,**arg):
arg['text']='Selectionné'
arg['bg']='Misty rose'
arg['fg']='Black'
# Création du LabelFrame contenant le widget Label
super(LabelAfficheur,self).__init__(maitre,arg)
self.nombre=nombre
self.selectionne=selectionne
self.grid()
# Création du Label qui affiche le nombre selectionné
labelSelection=tk.Label(self,width=10,
textvariable=self.nombre,height=6,justify="center")
labelSelection.grid(row=0,column=0)
class LabelGrille(tk.LabelFrame):
def __init__(self,maitre,nombre,selection,**arg):
arg['text']='Ne contient que des Labels'
arg['bg']='Gray50'
arg['fg']='Black'
arg['takefocus']=1
arg['highlightthickness']=1
arg['highlightcolor']="red"
# Création du LabelFrame contenant la grille de labels
super(LabelGrille,self).__init__(maitre,arg)
self.nombre=nombre
self.selectionne=selectionne
# Le focus est donné au LabelFrame quand le curseur
# entre dans le LabelFrame et il lui est enlevé quand
# on sort du LabelFrame en le donnant à maitre
self.bind('<Enter>',lambda evt:self.focus_set())
self.bind('<Leave>',lambda evt:maitre.focus_set())
# Création de la grille de Labels
ligne=0
colonne=0
self.lab=list()
i=0
for j in range(0,30):
self.lab.append(tk.Label(self,text=str(j),takefocus=0,
bg="Gray90",width=3,height=1,bd=5))
self.lab[j].bind('<Button>',lambda evt: self.Bouge(evt))
self.lab[j].grid(row=ligne,column=colonne)
j+=1
ligne+=1
if ligne>4:
ligne=0
colonne+=1
self.event_add('<<Fleches>>','<Up>', '<Down>', '<Right>', '<Left>')
self.bind('<<Fleches>>',lambda evt: self.Bouge(evt))
self.mvt={'Up':-1,
'Down':+1,
'Right':+5,
'Left':-5}
self.grid
# Fonction qui gère les flèches
def Bouge(self,evt):
val=self.mvt.get(evt.keysym)
if val is None:
val=self.lab.index(evt.widget)
else:
val=(nombre.get()+val)%30
nombre.set(val)
# Fonction de mise à jour de la grille. Permet de
# visualiser le nombre choisi
def MaJ(self,*arg): # l'argument *arg est obligatoire pour l'utilisation de trace_add
if self.selectionne.get() is not None:
self.lab[self.selectionne.get()]['relief']='flat'
self.selectionne.set(nombre.get())
self.lab[self.selectionne.get()]['relief']='groove'
if __name__=="__main__":
fp=tk.Tk()
nombre=tk.IntVar(value=1)
selectionne=tk.IntVar(value=1)
l=list()
for j, f in enumerate((LabelListe, LabelAfficheur,LabelGrille)):
w= f(fp, nombre,selectionne)
w.grid(row=0,column=j, sticky="ns")
l.append(w)
nombre.trace_add('write',l[2].MaJ) # L'ordre d'enregistrement de la fonction
nombre.trace_add('write',l[0].MaJ) # dans trace est important
nombre.set(0)
tk.mainloop() |
Partager