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

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

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Points : 65
    Points
    65
    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 du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Points : 65
    Points
    65
    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 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,

    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 du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Points : 65
    Points
    65
    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 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 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 du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

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

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

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Points : 65
    Points
    65
    Par défaut
    Voilà, j'ai viré les frames, les images, les save/load et autres, on arrive à 216 lignes, donc cela sauvegarde lorsque je rajoute un item mais je dois sortir puis relancer l'application pour que le nouveau choix apparaisse dans la liste déroulante. Le soucis se situe dans ces 2 lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        objListDeroul.configure (values=gens2)
        objListDeroul.update_idletasks              # C'est là qu'est le problème
    Nota, le lancement de l'application créera un fichier "0_Codes_LesClasses.txt" dans le dossier ou se trouvera le fichier de lancement.

    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
    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
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    import os.path
    import pickle
    import tkinter.ttk as ttk
    from tkinter import *
    import shutil                       #   Pour save des fichiers
    #   ____________________________________________________________________________________________________________________
    #   ____________________________________________________________________________________________________________________
    # Création de l'instance Tk
    fen1 =Tk()
    #   ____________________________________________________________________________________________________________________
    #   ____________________________________________________________________________________________________________________
    #   Les constantes
    NOMDOS = os.getcwd()                                    #   Nom du dossier courant
    NOMFIC = "0_Codes_LesClasses.txt"                       #   Nom du fichier des codes
    #   ____________________________________________________________________________________________________________________
    #   liste
    global gens
    gens = []
    #   ____________________________________________________________________________________________________________________
    #   ____________________________________________________________________________________________________________________
    #   Les fenêtres d'alertes
    def btMsgBox(msg, titre):
        """MsgBox d'alerte, un seul choix : fermeture"""
        varCoulPrinc = "Slate Gray"
        fenMsgBox = Toplevel()
        fenMsgBox.title(titre)
        fenMsgBox.configure(bg=varCoulPrinc)
        fenMsgBox.geometry('300x200+670+400')
        #   Objets
        objMsgBox1 = Label(fenMsgBox, height=10, width=30, text=titre + "\n \n" + msg, bg=varCoulPrinc)
        bouValidMsgBox = Button(fenMsgBox, text="VALID", bg="Cornflower Blue", command=fenMsgBox.destroy)
        #   positionnements des objets
        objMsgBox1.pack(side=TOP)
        bouValidMsgBox.pack(side=BOTTOM)
        #   *************************************
        #   Réception d'événements pour fenMsgBox
        #   *************************************
        fenMsgBox.mainloop()
    #   ____________________________________________________________________________________________________________________
    #   ____________________________________________________________________________________________________________________
    #   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é
        #   Création du msg de création
        titre = "INFORMATION !"
        msg = "Nouvelle fiche crée pour : \n Logging : " + prenom + "\n nomfami : " + nomfami + "\n Renseignement : "  + datenaiss + "\nTruqué (O/N) : " +   str(courriel)
        btMsgBox(msg, titre)
        #   Concatenation des listes
        fiche_nouvo=[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)
        # Mise a jour liste déroulante
        print(gens2)
        objListDeroul.configure (values=gens2)
        objListDeroul.update_idletasks              # C'est là qu'est le problème
     
     
     
     
     
     
    def foncBoutNew():
        #       *********************************
        #       CREATION DES ELEMENTS FENETRE NEW
        #       *********************************
        #       Création de la fenêtre nouveau code
        varCoulPrinc = "Dark Olive Green"
        varCoulSecon = "Olive Drab"
        fenNew = Toplevel()
        fenNew.title("Nouveau code")
        fenNew.configure(bg=varCoulPrinc)
        fenNew.geometry('480x250+600+400')
        #       Déclaration en global des variables de saisie
        global ObjNewNom
        global ObjNewCode
        global objNewRenseig
        global varTruqueeO_N2
        #global objLabelNew2
        varTruqueeO_N2 =IntVar()
        #       Création de la frame
        objFrameNew = LabelFrame(fenNew, text="Nouveau code", padx=5, pady=10, bg=varCoulPrinc)
        objFrameNew.pack(fill="both", expand="yes", padx=5, pady=10)
        #   ******************************
        #   Créa des objets dans la frames
        #   ******************************
        #   labels
        objLabelNew1 = Label(objFrameNew, height=1, width=20, text="Logging :", bg=varCoulPrinc)
        objLabelNew2 = Label(objFrameNew, height=1, width=20, text="Code :", bg=varCoulPrinc)
        objLabelNew3 = Label(objFrameNew, height=1, width=40, text="Renseignements", bg=varCoulPrinc)
        #   Créa objet nom
        ObjNewNom = Entry(objFrameNew, width=24, bg=varCoulSecon)
        #   Créa objet Code
        ObjNewCode = Entry(objFrameNew, width=24, bg=varCoulSecon)
        #   Créa objet bouton truquée
        # varTruqueeNew_O_N = 10  # initialisation de la variable cochée ou pas
        bouton0 = Checkbutton(objFrameNew, variable=varTruqueeO_N2, bg=varCoulPrinc ,text="Truquée ?", activebackground=varCoulPrinc)  # varTruqueeNew_O_N : 0= décochée, 1=cochée
        #   Créa objet renseignements
        objNewRenseig = Entry(objFrameNew, width=52, bg=varCoulSecon)
        #   *****************************************
        #   Positionnement  des objets dans la frames
        #   *****************************************
        #   labels
        objLabelNew1.grid(column=0, row=0, padx=10)
        objLabelNew2.grid(column=2, row=0, padx=5)
        objLabelNew3.grid(column=0, row=3, columnspan=3)
        #   Objets
        ObjNewNom.grid(column=0, row=1, padx=10, pady=(0 ,20))
        ObjNewCode.grid(column=2, row=1, padx=10, pady=(0 ,20))
        bouton0.grid(column=3, row=1, padx=(0, 5), pady=(0, 20))
        objNewRenseig.grid(column=0, row=4, columnspan=3, padx=10, pady=(0 ,20))
        #   *******************************
        #   *Boutons externes  ************
        #   *******************************
        #   Créa bouton Validation
        bouValidNew = Button(fenNew, text="VALID", bg="Cornflower Blue", command=foncBoutNewValid)
        #   Créa bouton Annuler
        bouQuitNew = Button(fenNew, text="EXIT", bg="Cornflower Blue", command=fenNew.destroy)
        #   Positionnement des boutons externes
        bouValidNew.pack(side=LEFT)
        bouQuitNew.pack(side=RIGHT)
        #   Focus sur la case Nom
        ObjNewNom.focus()
        #   **********************************
        #   Réception d'événements pour fenNew
        #   **********************************
        fenNew.mainloop()
     
     
     
     
     
     
     
     
     
     
     
    #   ____________________________________________________________________________________________________________________
    #   ____________________________________________________________________________________________________________________
    #  MAIN : Lancement du programme Principal
    #   ____________________________________________________________________________________________________________________
    #   Variables locales
    varCoulPrinc = "Sea Green"
    varCoulSecon = "Medium Sea Green"
    #   ____________________________________________________________________________________________________________________
    #   Création fenêtre principale
    fen1.geometry('620x400+600+325')
    fen1.title("Codes")
    fen1.configure(bg = varCoulPrinc)
    #   ____________________________________________________________________________________________________________________
    # #   Créa objet logging
    Label(fen1 ,height=1 ,width=30, text="Logging", bg=varCoulPrinc).grid(row=0, sticky=W, padx=5, pady=(5 ,0))
    objLogging=Label(fen1 ,height=1 ,width=30, bg=varCoulSecon, relief=SUNKEN)
    #   Créa objet code
    Label(fen1 ,height=1 ,width=30, text="Code", bg=varCoulPrinc).grid(row=0 ,column=1, padx=(40 ,5), pady=(5 ,0))
    objCode = Label(fen1 ,height=1 ,width=30, bg=varCoulSecon, relief=SUNKEN)
    #   Créa objet bouton truquée
    varTruqueeO_N =0  # initialisation de la variable cochée ou pas
    objTruquee = Checkbutton(fen1, variable=varTruqueeO_N, bg=varCoulPrinc, text="Truquée ?", activebackground=varCoulPrinc)  # varTruqueeO_N : 0= décochée, 1=cochée
    #   Créa objet renseignements
    Label(fen1 ,height=1 ,width=68, text="Renseignements", bg=varCoulPrinc).grid(row=2 ,column=0, padx=5, columnspan=2, sticky=W, pady=(15 ,0))
    objRenseig = Label(fen1 ,height=5 ,width=68, bg=varCoulSecon, relief=SUNKEN)
    #   Créations - Boutons hors-frames
    bouNew =Button(fen1, bg="Cornflower Blue", text="NEW", command=foncBoutNew)
    bouQuit =Button(fen1, bg="Cornflower Blue", text="EXIT", command=fen1.destroy)
    #   Position des labels ou est inscrit les codes
    objLogging.grid(row=1, sticky=W, padx=5, pady=(0 ,5))
    objCode.grid(row=1 ,column=1, padx=(40 ,5), pady=(0 ,5))
    objTruquee.grid(row=1 ,column=2, padx=(0 ,5), pady=(0 ,5))
    objRenseig.grid(row=3 ,padx=5, columnspan=2, sticky=W, pady=(0 ,5))
     
    #   ____________________________________________________________________________________________________________________
    #  Créations - liste déroulante
    #  Récup des logging seulement pour la liste déroulante
    lstCode =[]     # verif crois que ça sert a rien
    #  Verif que le fichier existe
    if os.path.exists(NOMFIC):
        # Existe, on le lit
        with open (NOMFIC, "rb") as fichier:
            gens = pickle.load (fichier)
    else:
        #   Existe pas : on le crée
        gens=[]
        with open (NOMFIC, "wb") as fichier:
            pickle.dump (gens, fichier)
    #   Création de la liste
    lstCodeActuel = []
    for e in enumerate(gens):
        lstCodeActuel.append(e[1][0])
    #  Création de la liste déroulante
    objListDeroul = ttk.Combobox(fen1, values=lstCodeActuel, width=24)  # Récup des valeurs : logging
     
     
     
    #   ____________________________________________________________________________________________________________________
    #   Position des Liste déroulante
    objListDeroul.grid(row=9 ,column=0, sticky=E, pady=(5))
    #   Position des boutons externes
    bouNew.grid(row=10 ,column=0)
    bouQuit.grid(row=10 ,column=1)
    #   ____________________________________________________________________________________________________________________
    #   Réception d'événements
    fen1.mainloop()

  8. #8
    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,

    Essentiellement, lorsqu'une de vos fonctions appelle .mainloop, elle ne pourra se terminer qu'à l'émission d'un .quit ou d'un .destroy de la fenêtre principale. Et donc objListDeroul.configure (values=gens2) ne s'exécute qu'après la destruction de la fenêtre principale car a été appelé, un peu avant, la fonction btMsgBox(msg, titre) qui bloque à l'appel à mainloop.
    Lorsque çà se débloque, la fenêtre principale et les widgets qu'ils contiennent sont détruit lorsque les instructions "en attente" sont exécutées.

    Donc pour sortir de .mainloop, il faut des .quit et pour construire des dialogues où on attend qu'il se termine pour passer à la suite, on peut utiliser .wait_window (ou .mainloop mais pas comme çà).

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

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

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Points : 65
    Points
    65
    Par défaut
    Wiztricks je te remercie, tu m'enlève une épine du pied comme souvent.
    J'ai réglé ce problème en enlevant le retour sur l'appel de la fonction :
    fenMsgBox.mainloop
    à la place de
    Je parie que ce n'est pas très élégant mais ça fonctionne, encore merci.

    Il ne me reste plus qu'a lire le lien que tu as fourni et essayer de mieux comprendre, c'est un peu ardu pour moi !

  10. #10
    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 Ragus1970 Voir le message
    Il ne me reste plus qu'a lire le lien que tu as fourni et essayer de mieux comprendre, c'est un peu ardu pour moi !
    La programmation évènementielle n'est pas "simple".
    Il faut prendre son temps et si on se sent perdu, faire autre chose histoire que çà décante un peu et s'y remettre à plus tard (ou ouvrir une nouvelle discussion )

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

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

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Points : 65
    Points
    65
    Par défaut
    C'est ce que je prévoyais de faire, je voulais juste terminer ce dernier problème sur mon programme, j'aime bien créer quelque chose en même temps que j'apprends, mais là oui, il faut que je termine le livre de Swinnen !
    Et surtout que je me mette aux classes !

    Bonne journée

+ 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