IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

Conflit ComboBox et ListBox


Sujet :

Tkinter Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Août 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 87
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Août 2009
    Messages : 39
    Points : 33
    Points
    33
    Par défaut Conflit ComboBox et ListBox
    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()

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Déjà quitte à prendre le temps de poster le message d'erreur, assurez vous qu'il soit complet.
    Sinon, il faut récupérer le programme, trouver comment l'exécuter pour reproduire le problème et espérer que le message d'erreur obtenu soit identique (ce qu'on ne peut vérifier puisque vous ne le donnez pas).
    Dans mon cas, je trouve:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Traceback (most recent call last):
      File "C:\py_env\py_39\lib\tkinter\__init__.py", line 1892, in __call__
        return self.func(*args)
      File "D:\_WORKS\py_samples\dvp_samples\forum\ac_36.py", line 20, in sup_let_x
        lbox_let_x.delete(sel)           #suppression d'un élément dans la listbox
      File "C:\py_env\py_39\lib\tkinter\__init__.py", line 3179, in delete
        self.tk.call(self._w, 'delete', first, last)
    _tkinter.TclError: bad listbox index "": must be active, anchor, end, @x,y, or a number
    Le message d'erreur est explicite: la selection de la Listbox retourne un tuple vide (rien n'est sélectionné) et vous essayez de faire quelque chose de ce rien.

    N'oubliez pas que l'évènement ListboxSelect est généré pour tout changement dans la sélection de la Listbox (pas qu'il y a une sélection non vide). Du coup, sélectionner un item dans la Listbox puis aller dans la Combobox (le dé-électionne) et on se retrouve avec rien.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Août 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 87
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Août 2009
    Messages : 39
    Points : 33
    Points
    33
    Par défaut remerciements
    Un grand merci pour cette réponse rapide

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Août 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 87
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Août 2009
    Messages : 39
    Points : 33
    Points
    33
    Par défaut déselection listbox
    Du coup comment dois je faire pour que, lorsque je vais dans la Combobox, je ne désélectionne pas la Listbox
    Merci pour la réponse

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Août 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 87
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Août 2009
    Messages : 39
    Points : 33
    Points
    33
    Par défaut Fin de problème
    J'ai simplement testé lbox.curselection() auquel cas je sors
    Excusez moi

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Cerisier Voir le message
    J'ai simplement testé lbox.curselection() auquel cas je sors
    C'est une solution.... mais ouvrez une documentation et tester les effets d'exportselection (et leurs conséquences).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. DataRow et ComboBox(ou ListBox)
    Par Miko95 dans le forum C#
    Réponses: 1
    Dernier message: 17/09/2009, 05h02
  2. Combobox vers listbox
    Par regliss76 dans le forum IHM
    Réponses: 8
    Dernier message: 24/09/2008, 14h38
  3. [Delphi for PHP] Récupérer les données d'un Datagrid pour une combobox ou listbox
    Par Truebison dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 27/08/2007, 09h27
  4. [VB2005] lien entre combobox et listbox
    Par Petrolia dans le forum Windows Forms
    Réponses: 20
    Dernier message: 04/06/2006, 14h28
  5. COMBOBOX ET LISTBOX & BDD
    Par stevenleferran dans le forum Bases de données
    Réponses: 1
    Dernier message: 23/05/2005, 12h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo