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 :

Tkinter liste déroulante dynamique


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Par défaut Tkinter liste déroulante dynamique
    Bonjour,

    J'ai une liste, lorsque je rajoute un item dans cette liste, je veut qu'elle s'enregistre et mette à jour la liste déroulante sans avoir besoin de fermer puis ré-ouvrir la fenêtre principale.
    Ce code fonctionne :
    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
    import tkinter.ttk as ttk
    from tkinter import *
    import pickle
    import os.path
     
    def foncMiseAJour():
        print("Liste actuelle : " + str(lst))            # ancienne liste
        a=objNewItem.get()
        print("Valeur ajoutée : " + a)                   # Le rajout
        #   Ajout de a dans la list lst
        lst.append(a)
        #########################
        # Save
        #########################
        with open (NOMFIC, "wb") as fichier:
            pickle.dump (lst, fichier)
        # Verif
        print("Liste nouvelle : " + str(lst))            # Nouvelle liste
        objListDeroul.configure(values=lst)              # Mise a jour liste déroulante
     
    #   ____________________________________________________________________________________________________________________
    #   MAIN
    #   ____________________________________________________________________________________________________________________
    #   Chemin d'accès et initialisation de la liste
    NOMFIC = "toto"                                     # Nom du fichier
    lst = []
    #########################
    # Load
    #########################
    #  Verif que le fichier existe
    if os.path.exists(NOMFIC):
        # Existe, on le lit
        with open (NOMFIC, "rb") as fichier:
            lst = pickle.load (fichier)
    else:
        #   Existe pas : on le crée
        with open (NOMFIC, "wb") as fichier:
            pickle.dump (lst, fichier)
    #   Création fenêtre fen1
    fen1 = Tk()
    fen1.configure(bg = "Light Steel Blue")
    #  Création de la liste déroulante
    objListDeroul = ttk.Combobox(fen1, values=lst, width=24)  # Récup des valeurs : logging
    #   Création Entry
    objNewItem = Entry(fen1)
    #   Création bouton validation
    objValid =Button(fen1, text="Validation", command= foncMiseAJour)
    #   positionnement des objets
    objListDeroul.pack()
    objNewItem.pack(pady=10)
    objValid.pack()
    #   Réception d'événements
    fen1.mainloop()
    Mais quand je le retranscrit dans mon programme j'ai ce message d'erreur que je ne comprends pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Users\jm.aix\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1699, in __call__
        return self.func(*args)
      File "C:/0_Les_Codes/0_Codes_Menu_en_cours.py", line 509, in foncBoutNewValid
        objListDeroul.configure (values=gens2)
      File "C:\Users\jm.aix\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1479, in configure
        return self._configure('configure', cnf, kw)
      File "C:\Users\jm.aix\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1470, in _configure
        self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
    _tkinter.TclError: invalid command name ".!labelframe2.!labelframe.!combobox"

    Voici la partie de mon code qui gère l'enregistrement sinon je mettrais le code entier mais il y a plus de 1000 lignes :
    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
    #   ____________________________________________________________________________________________________________________
    #   Fonction de validation de création de nouvelle fiche
    def foncBoutNewValid():
        """ Bouton de validation permettant de créer une nouvelle fiche"""
        #       Récupération des données de la fenêtre NEW (création d'un nouveau code)
        prenom = ObjNewNom.get()
        nomfami = ObjNewCode.get()
        datenaiss = objNewRenseig.get()
        #   Récupération de la case à cocher
        if varTruqueeO_N2.get():
            courriel ="Oui"  # Coché
        else:
            courriel ="Non"  # Pas coché
        #   Vérification 1 - log ou code vide
        if prenom=="" or nomfami=="":
            titre = "ALERTE !"
            msg="Vous n'avez rien indiqué dans \n la case LOGGING ou dans la case CODE !"
            btMsgBox(msg, titre)
            return
         #   Vérification 2 - Logging existe déja
        for e in gens:
            if prenom == e[2]:
                titre = "ALERTE !"
                msg = "Le logging : " + e[2] +  " existe déja !"
                btMsgBox(msg, titre)
                return
        #   Création du msg de création
        titre = "INFORMATION !"
        msg = "Nouvelle fiche crée pour : \n La liste N° " + str(varNumList)  + "( " + str(varNomList) + ") \n Logging : " + prenom + "\n nomfami : " + nomfami + "\n Renseignement : "  + datenaiss + "\nTruqué (O/N) : " +   str(courriel)
        btMsgBox(msg, titre)
        #   Concatenation des listes
        fiche_nouvo=[varNumList, varNomList, prenom, nomfami, datenaiss, courriel]
        gens.append (fiche_nouvo)
        #   Trie de la liste par logging [2]
        gens2 = sorted (gens, key=lambda gens: gens[2])
        #  Enregistrement
        with open (NOMFIC, "wb") as fichier:
            pickle.dump (gens2, fichier)
     
        print(gens2)
        objListDeroul.configure (values=gens2) # C'est là que ça ne veut pas

    Si quelqu'un peut m'aider ?

  2. #2
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Par défaut
    Si je retire la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objListDeroul.configure (values=gens2)
    je n'ai pas ce msg d'erreur et l'enregistrement se fait nbien, je vois bien le rajout dans la liste déroulante APRES aveouir fermé puis ré-ouvert l'application.
    donne par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [[1, '01', 'testNom', 'testCode', '', 'Non'], [1, '01', 'a001100', 'hj', '', 'Non'], [1, '01', 'aa', '19', '', 'Non']]

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Un message comme "invalid command name ".!labelframe2.!labelframe.!combobox"" signifie que l'instance de l'objet Python objListDeroul est associé à une "commande"/variable TCL qui n'existe plus.
    Le message d'erreur est facile à reproduire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    >>> from tkinter import Label
    >>> w = Label()
    >>> w.configure(text='blabla')
    >>> w.destroy()
    >>> w.configure(text='blabla')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "C:\py_env\py34-64\lib\tkinter\__init__.py", line 1270, in configure
        return self._configure('configure', cnf, kw)
      File "C:\py_env\py34-64\lib\tkinter\__init__.py", line 1261, in _configure
        self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
    _tkinter.TclError: invalid command name ".48566848"
    >>>
    Après ce que fait votre code pour en arriver là...

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

  4. #4
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Par défaut
    Merci de ta réponse, je comprends avec ton exemple le principe mais pour mon programme je ne comprends pas trop :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        objListDeroul.configure (values=gens2)
        # objListDeroul.update_idletasks
    Là ça fonctionne mais si je remet la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        objListDeroul.configure (values=gens2)
        objListDeroul.update_idletasks
    Ca me met l'erreur indiqué plus haut, pourtant l'objet existe toujours vu que Python accepte la commande précédente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objListDeroul.configure (values=gens2)
    A aucun moment je détruit cet objet dans le code.

    Tu vois autre chose ?
    Je peut mettre le code entier mais il y aura 1000 lignes !

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Citation Envoyé par Ragus1970 Voir le message
    A aucun moment je détruit cet objet dans le code.
    Inutile de le faire "explicitement". S'il s'appelle: ".!labelframe2.!labelframe.!combobox""
    C'est une combobox qui a pour parent un LabelFrame qui a pour parent un LabelFrame. Donc si vous détruisez un des parents, tous les fils sont aussi détruits.

    Citation Envoyé par Ragus1970 Voir le message
    Tu vois autre chose ?
    Je peut mettre le code entier mais il y aura 1000 lignes !
    A vous de le réduire à quelques dizaines de lignes pour reproduire le problème sans poster 1000 lignes à lire et essayer de le faire tourner pour comprendre ce qu'il se passe. Ca réduit grandement le nombre de ceux qui pourraient vous aider mais qui ont aussi autre chose à faire.

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

  6. #6
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Par défaut
    Oui, je comprends, je vais le réduire et je reviens dès que je peut.
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. récupérer la valeur d'une liste déroulante dynamique
    Par grinder59 dans le forum Général JavaScript
    Réponses: 21
    Dernier message: 23/01/2006, 17h51
  2. Liste déroulante dynamique
    Par Screw16 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 30/10/2005, 20h37
  3. [HTML] liste déroulante dynamique
    Par lacousinee dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 04/08/2005, 20h51
  4. Liste déroulante dynamique ?
    Par Regis.C dans le forum Composants
    Réponses: 5
    Dernier message: 29/06/2005, 12h09
  5. [FORMULAIRE] Liste déroulante dynamique
    Par bchristo dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 18/01/2005, 10h07

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