Dans ce programme une Listbox permet de gérer une liste (let_x) (pour le moment il y a seulement affichage et suppression d'éléments)
Cette liste (let_x) est utilisée ultérieurement par une fonction choisie au moyen d'une Combobox
Si on lance le programme et que l'on choisit une fonction sans modifier au prélable le contenu de Listbox tout se passe correctement
Si on lance le programme et que l'on effectue une ou plusieurs suppressions dans la Listbox, celles ci sont bien exécutées et répercutées dans let_x
si alors on continue en lançant par exemple 'Fonction A', elle est bien exécutée mais ensuite la fonction 'choix programme' ne s'arrête pas et enchaine sur la fonction 'sup_let_x'
ce qui provoque une erreur
si on rééxécute Fonction A , tout se passe bien
tout se passe comme si 'sup_let_x(event)' était encore actif

Voici ce qui apparaît dans la console
début choix programme
Fonction A [['m', 6], ['i', 6]]
fin choix programme
debut sup_let_x # ENCHAINEMENT AUTOMATIQUE SUR sup_let_x
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\KOEHRER\AppData\Local\Programs\Thonny\lib\tkinter\__init__.py", line 1705, in __call__
return self.func(*args)
File "D:\Documents\python\programmes\Sutom_affic
Fin affichage console


et voici le code

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
from tkinter import *
root = Tk()
root.geometry('300x200')
def choix_programme(event):   
    print('début choix programme')
    select = lstCombo.get()   
    if int(select[0]) == 1 :
        print('Fonction A', let_x)     
    elif int(select[0]) == 2 :
        print('Fonction B', let_x)   
    else :
        pass
    print('fin choix programme') r
    return
 
def sup_let_x(event) :              # suppression d'éléments  de let_x    
    print('debut sup_let_x')
    sel = lbox_let_x.curselection()    
    lbox_let_x.delete(sel)           #suppression d'un élément dans la listbox
    let_x.remove(let_x[sel[0]])   # mise à jour de la liste
 
    lbox_let_x.delete(0, END)     # effacement de la listbox 
    for item in let_x :                #réinitialisation de la liste des lettres
        #elem = '[' + str(item[0]) + ',' + str(item[1]) + ']'
        elem =  str(item[0]) + ',' + str(item[1]) 
        lbox_let_x.insert(END, elem)
    print('fin sup_let_x', let_x)
    return
 
#programme principal
#les titres    
choix = Label(root, text = 'Choisissez la fonction').grid(row = 0, column = 1, sticky = E)
let_x = Label(root, text = 'Lettres_x').grid(row = 2, column = 1)
 
# les données
lst_fonction =  [[1,'Fonction A'],[2,'Fonction B']]
let_x = [['m',6],['i',6],['n',4],['o',1]]
nb_x = len(let_x)
 
# choix des fonctions
lstCombo = ttk.Combobox(root, values=lst_fonction)
lstCombo.grid(row =1, columnspan = 2)
lstCombo.current(0)
lstCombo.bind("<<ComboboxSelected>>", choix_programme)
 
# affichages des listes de données
lbox_let_x = Listbox(root,width=6,height=nb_x )   
lbox_let_x.grid(row = 3, column = 1)
 
#chargement initial de let_x
for item in let_x :
    elem = str(item[0]) + ',' + str(item[1]) 
    lbox_let_x.insert(END, elem)  #End, elem signifie que l'on place l'item courant après le dernier placé       
 
lbox_let_x.bind('<<ListboxSelect>>',sup_let_x)
 
root.mainloop()