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
| #exercice 14.1
#evolution de la combobox. La listbox et l'ascenseur sont dans
#une fenetre toplevel situé juste sous l'entry. La fenetre disparait à la
#selection de l'item dans la listbox
from tkinter import *
class ComboFull(Frame):
"Widget composite associant un champ d'entrée avec une boîte de liste dans une fenetre"
def __init__(self,boss,item='',items=[],command='',width=10,listSize=5):
Frame.__init__(self,boss) #constructeur de la classe parente
# (<boss> est la réf. du widget 'maître')
self.items =items # items à placer dans la boîte de liste
self.command =command # fonction à invoquer après clic ou <Enter>
self.item =item # item entré ou sélectionné
self.listSize = listSize
self.width = width
self.boss = boss # self.boss pour avoir une reference lors de
# la recuperation des coordonnées sur l écran
# Champ d'entrée :
self.entree =Entry(self, width =width) # largeur en caractères
self.entree.insert(END, item)
self.entree.bind("<Return>", self.sortieE)
self.entree.pack(side =LEFT)
#Bouton d'appel de la fenetre
self.bou = PhotoImage(file= "down.gif")
Button(self, image = self.bou, command = self.popup).pack()
def sortieL(self, event =None):
# Extraire de la liste l'item qui a été sélectionné :
index =self.bListe.curselection() # renvoie un tuple d'index
ind0 =int(index[0]) # on ne garde que le premier
self.item =self.items[ind0]
# Actualiser le champ d'entrée avec l'item choisi :
self.entree.delete(0, END)
self.entree.insert(END, self.item)
# Exécuter la commande indiquée, avec l'item choisi comme argument :
self.command(self.item)
self.pop.destroy()
def sortieE(self, event =None):
# Exécuter la commande indiquée, avec l'argument-item encodé tel quel :
self.command(self.entree.get())
def get(self):
# Renvoyer le dernier item sélectionné dans la boîte de liste
return self.item
def popup(self):
#ouverture d'une fenetre toplevel contenant le comboBox"
x= self.winfo_x() #position de la frame
y= self.winfo_y() #dans la fenetre principale (Master?)
xM = self.boss.winfo_x() # position du Master
yM = self.boss.winfo_y() # sur l'ecran
xT = xM + x + 5 #position du toplevel
yT = yM + y + 30 #sous l'entry
# Creation fenetre satellite sous l'entry
self.pop = Toplevel() # self.pop plutot que pop pour pouvoir detruire
# le toplevel
self.pop.geometry("+{0}+{1}".format(xT,yT))
self.pop.overrideredirect(1) # => fenêtre sans bordure ni bandeau
self.pop.attributes("-topmost",1) # affichage du toplevel au dessus
# Boîte de liste, munie d'un ascenseur (scroll bar) :
cadreLB =Frame(self.pop) # cadre pour l'ensemble des 2
self.bListe =Listbox(cadreLB, height =self.listSize, width =self.width-2)
self.scrol =Scrollbar(cadreLB, command =self.bListe.yview)
self.bListe.config(yscrollcommand =self.scrol.set)
self.bListe.bind("<ButtonRelease-1>", self.sortieL)
self.bListe.pack(side =LEFT)
self.scrol.pack(expand =YES, fill =Y)
cadreLB.pack()
# Remplissage de la boîte de liste avec les items fournis :
for it in self.items:
self.bListe.insert(END, it)
if __name__ =="__main__": # --- Programme de test ---
def changeCoul(col):
fen.configure(background = col)
def changeLabel():
lab.configure(text = combo.get())
couleurs = ('navy', 'royal blue', 'steelblue1', 'cadet blue',
'lawn green', 'forest green', 'yellow', 'dark red',
'grey80','grey60', 'grey40', 'grey20', 'pink')
fen =Tk()
combo =ComboFull(fen, item ="néant", items =couleurs, command =changeCoul,
width =15, listSize =6)
combo.grid(row =1, columnspan =2, padx =10, pady =10)
bou = Button(fen, text ="Test", command =changeLabel)
bou.grid(row =3, column =0, padx =8, pady =8)
lab = Label(fen, text ="Bonjour", bg ="ivory", width =15)
lab.grid(row =3, column =1, padx =8)
fen.mainloop() |
Partager