Bonjour,

J'ai fait l'exercice 14.1 du Swinnen. Quelqu'un peut t il me montrer comment optimiser le code?
Merci

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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()