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 pb msg d'erreur


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 pb msg d'erreur
    Bonjour,

    Ce code permet de couper un fichier texte en tant de fichiers texte, ça fonctionne bien, seulement si je ne ferme pas la fenêtre et que je revalide une 2ème demande, j'ai ce msg d'erreur que je ne comprends pas :

    C:\untitled1\venv\Scripts\python.exe C:/0_Mes_codes/11a_DecoupFichier.pyw
    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_Mes_codes/11a_DecoupFichier.pyw", line 119, in verif
    foncFenAlerte1Choix ("Extraction terminée", "Vos fichiers sont crées à l'emplacement choisi !")
    File "C:\0_Mes_codes\Fonctions\FoncMesAlerte1button.pyw", line 16, in foncFenAlerte1Choix
    fenMsgBox.title(titre)
    File "C:\Users\jm.aix\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1979, in wm_title
    return self.tk.call('wm', 'title', self._w, string)
    _tkinter.TclError: bad window path name ".!toplevel"



    Cela viens probablement de cet endroit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from Fonctions.FoncMesAlerte1button import foncFenAlerte1Choix
    foncFenAlerte1Choix ("Extraction terminée", "Vos fichiers sont crées à l'emplacement choisi !")
    Si je remplace ces 2 lignes par print("ok"), je n'ai pas ce soucis.


    Voici le code complet :

    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
    import os.path
    from os import chdir                    #   Pour chargement des images dans autre répertoire chdir = chg de répertoire
    import tkinter
    from tkinter import *
    from tkinter import filedialog, font    #   Pour module de recherche de dossiers
    from math import *
    #   ____________________________________________________________________________________________________________________
    fen1 =Tk()
    #   ____________________________________________________________________________________________________________________
    #   Chargement des images
    NOMDOS = os.getcwd()                                    #   Nom du dossier courant
    chdir(NOMDOS + '\Images')                               #   Chg de répertoire courant pour charger les images
    PHOTO4 = PhotoImage(file='Icone30x30_Exit.png')
    PHOTO5 = PhotoImage(file='Icone30x30_valid.png')
    PHOTO1 = PhotoImage(file='Icone30x30_7Texte.png')
    chdir(NOMDOS)                                           #   Chg de répertoire courant pour revenir a la normale
    #   ____________________________________________________________________________________________________________________
    #   Les variables
    varCoulPrinc = "Dim Gray"
    varCoulSecond = "Light Slate Gray"
    FICHIER = ""
    DOSSIER = ""
    #   ____________________________________________________________________________________________________________________
    #   Les fonctions
    #   ____________________________________________________________________________________________________________________
     
    def recherche():
        """Lance la fenêtre de recherche de fichier"""
        global FICHIER
        global CHEMIN
        global DOSSIER
        fen2 = Toplevel
        fen2.filename = filedialog.askopenfilename (title="Selection fichier d'entrée")      #   fen2.filename   : indique le dossier avec son chemmin
        LabelChemin1.configure(text= fen2.filename)                                  #   inscription du dossier dans le label
        #Extraction du nom du fichier seul
        from os.path import basename
        FICHIER = basename (fen2.filename)
        DOSSIER = fen2.filename.strip(FICHIER)
        CHEMIN = DOSSIER + FICHIER
     
    def recherche2():
        """Lance la fenêtre de recherche de fichier"""
        global FICHIER2
        global CHEMIN2
        global DOSSIER2
        fen3 = Toplevel
        fen3.filename = filedialog.askdirectory  (title="Selection dossier de sortie")      #   fen2.filename   : indique le dossier avec son chemmin
        LabelChemin2.configure(text= fen3.filename)                                  #   inscription du dossier dans le label
        #Extraction du nom du fichier seul
        from os.path import basename
        FICHIER2 = basename (fen3.filename)
        DOSSIER2 = fen3.filename.strip(FICHIER)
        CHEMIN2 = DOSSIER + FICHIER
     
    def verif():
        #   Récupération nombre de découpe dans variable varNbDecoup
        varNbDecoup = NbDecoup.get ()
        #   Changement du type de la variable en integer
        varNbDecoup = int (varNbDecoup)
        #   Vérification que le nombre de découpe ne soit pas inférieur à 1
        if varNbDecoup<1:
            from Fonctions.FoncMesAlerte1button import foncFenAlerte1Choix
            foncFenAlerte1Choix ("Alerte", "Attention, vous demandez de couper ce fichier \navec un nombre inférieur à 1, c'est impossible,\nmerci de modifier ce nombre puis relancez !")
        else:
            #   Ouverture fichier
            fd = open (CHEMIN, 'r')
            #   Boucle pour compter le nombre de lignes
            NumberOfLine = 0
            for line in fd:
                NumberOfLine += 1
            #   Calcul du nombre de fichier en arrondi.sup
            varNbFichier = ceil(NumberOfLine/varNbDecoup)
            #   Là on a :
            #   Fichier d'entrée :                  FICHIER             ex: 100 lignes.txt
            #   Le chemin du dossier d'entrée:      DOSSIER             ex: C:/Users/jm.aix/Desktop
            #   Le chemin total entrée:             CHEMIN              ex: C:/Users/jm.aix/Desktop/100 lignes.txt
            #   Fichier sortie :                    FICHIER2            ex: 100 lignes.txt
            #   Le chemin du dossier sortie:        DOSSIER2            ex: C:/Users/jm.aix/Desktop
            #   Le chemin total sortie:             CHEMIN2             ex: C:/Users/jm.aix/Desktop/100 lignes.txt
            #   le nb de lignes du fichier :        NumberOfLine        ex: 100
            #   Le nb de découpe à faire :          varNbDecoup         ex: 50
            #   Le nb de fichiers de sorties :      varNbFichier        ex: 2
            #   ________________________________________________
            #   Ouverture fichier
            #   ________________________________________________
            with open (CHEMIN, 'r') as a:
                #   Lecture de la totalité et récup dans variable txtTotal
                txtTotal=a.read()
            #   ________________________________________________
            #   Création liste
            #   ________________________________________________
            lstTotal = []
            lstTotal=txtTotal.split("\n")
            #   ________________________________________________
            #   Découpe en plusieurs fichiers
            #   ________________________________________________
            bb= []
            debutSeq = 0
            finSeq = varNbDecoup
            for e in range(varNbFichier):       # Séquence sur tant de fichiers : varNbFichier
                #   Création séquence
                bb=lstTotal[debutSeq:finSeq]
                debutSeq= finSeq
                finSeq= finSeq + varNbDecoup
                #   Définition des noms de dossiers
                NomFichSORT = DOSSIER2 + 'test' + str(e) + '.txt'
                #   Ouverture fichier
                Fichier = open (NomFichSORT, 'w')
                #   Changement liste en texte   :   #\n pour retour à la ligne à chaque valeur
                aa= "\n".join(bb)
                #   Ecriture dans fichier texte
                Fichier.write (aa)
                #   Fermeture fichier
                Fichier.close ()
                #   ________________________________________________
                #   Message indiquant la finalité ok
                #   ________________________________________________
            from Fonctions.FoncMesAlerte1button import foncFenAlerte1Choix
            foncFenAlerte1Choix ("Extraction terminée", "Vos fichiers sont crées à l'emplacement choisi !")
     
     
    #   ____________________________________________________________________________________________________________________
    #   ____________________________________________________________________________________________________________________
    #   Création fenêtre principale
    fen1.geometry('298x310')
    fen1.configure(bg = varCoulPrinc)
    fen1.title("Découpe de fichiers")
    #   ________________________________________________
    #   Créations - Labels
    LabelTexte = Label(fen1 ,height=1 ,width=40, heigh = 2, bg =varCoulPrinc, text = "Choisissez le nombre de lignes par découpe.")
    LabelTexte2 = Label(fen1 ,height=1 ,width=40, heigh = 4, bg =varCoulPrinc, text = "Choisissez via les boutons de recherche,\nle fichier à découper  (fichier texte).\net le dossier des fichiers de sorties.\nPuis validez.")
    LabelTexte3 = Label(fen1 ,height=1 ,width=40, bg =varCoulPrinc, text = "Fichier d'entrée")
    LabelTexte4 = Label(fen1 ,height=1 ,width=40, bg =varCoulPrinc, text = "Dossier de sortie")
    LabelChemin1 = Label(fen1 ,height=1 ,width=40, bg =varCoulSecond, relief='ridge')
    LabelChemin2 = Label(fen1 ,height=1 ,width=40, bg =varCoulSecond, relief='ridge')
    #   ________________________________________________
    #  Création - Button Recherche
    butRecher1 =Button(fen1, image=PHOTO1, relief='flat', bg = varCoulPrinc, command = recherche)
    butRecher2 =Button(fen1, image=PHOTO1, relief='flat', bg = varCoulPrinc, command = recherche2)
    #  Création - Champ Nb de découpe
    NbDecoup =Entry(fen1)
    NbDecoup.width=24
    #  Création - Button Validation
    butValid =Button(fen1, image=PHOTO5, relief='flat', bg = varCoulPrinc, command=verif)
    #  Création - Button EXIT
    butExit =Button(fen1, image=PHOTO4, relief='flat', bg = varCoulPrinc, command=fen1.destroy)
    #   ________________________________________________
    #   POSITIONNEMENTS 1
    LabelTexte.grid(row=0, padx=5, pady=2)
    NbDecoup.grid(row=1, padx=5, pady=2)
    LabelTexte2.grid(row=2, padx=5, pady=2)
    LabelTexte3.grid(row=3,  padx=5, pady=(15,0), sticky="W")
    butRecher1.grid(row=4,  padx=5, sticky="W")
    LabelChemin1.grid(row=4, padx=5)
    LabelTexte4.grid(row=5,  padx=5, sticky="W")
    butRecher2.grid(row=6,  padx=5, sticky="W")
    LabelChemin2.grid(row=6, padx=5)
    butValid.grid(row=10, pady = 10, padx = 50, sticky="E")
    butExit.grid(row=10, pady = 10, padx = 5, sticky="E")
    #   ________________________________________________
    #   Centrage fenêtre
    from Fonctions.FoncCentreEcran import centreFenetre
    centreFenetre(fen1)
    #   Focus sur NbDecoup
    NbDecoup.focus_set()
    #   Réception d'événements
    fen1.mainloop()
    et la fonction :
    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
    import os.path
    from os import chdir        # Pour chargement des images dans autre répertoire chdir = chg de répertoire
    from tkinter import *
    #   Instancification
    fenMsgBox = Toplevel()#Tk()+
     
    def foncFenAlerte1Choix(titre, msg):
        """MsgBox d'alerte, un seul choix : fermeture"""
        #   Constantes
        global fenMsgBox
        NOMDOS = os.getcwd()                                    #   Nom du dossier courant
        chdir(NOMDOS + '\Images')                               #   Chg de répertoire courant pour charger les images
        PHOTO4 = PhotoImage(master=fenMsgBox, file='Icone30x30_Exit.png')
        chdir(NOMDOS)                                           #   Chg de répertoire courant pour revenir a la normale
        #   Création fenêtre
        fenMsgBox.title(titre)
        fenMsgBox.configure(bg="Slate Gray")
        fenMsgBox.geometry('300x360')
        #   Objets
        objMsgBox1 = Label(fenMsgBox, height=20, width=40, text=msg, bg="Gray")
        bouValidMsgBox = Button(fenMsgBox, image=PHOTO4, bg="Slate Gray", command=fenMsgBox.destroy)
        #   positionnements des objets
        objMsgBox1.pack(side=TOP)
        bouValidMsgBox.pack(side=BOTTOM)
        #   Centrage fenêtre
        from Fonctions.FoncCentreEcran import centreFenetre
        centreFenetre (fenMsgBox)
        #   Fenêtre fenMsgBox en 1er plan
        fenMsgBox.focus_set()
        #   Réception d'événements pour fenMsgBox
        fenMsgBox.mainloop()

    Si vous pouviez m'aider ?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 329
    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 329
    Points : 36 848
    Points
    36 848
    Par défaut
    Salut,

    Citation Envoyé par Ragus1970 Voir le message
    Cela viens probablement de cet endroit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from Fonctions.FoncMesAlerte1button import foncFenAlerte1Choix
    foncFenAlerte1Choix ("Extraction terminée", "Vos fichiers sont crées à l'emplacement choisi !")
    Si je remplace ces 2 lignes par print("ok"), je n'ai pas ce soucis.
    Le message d'erreur dit seulement que fenMsgBox ayant été détruite, on ne peut plus l'utiliser. Ce bout de code fonctionnerait en créant la Toplevel au début de la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def foncFenAlerte1Choix(titre, msg):
        """MsgBox d'alerte, un seul choix : fermeture"""
        #   Constantes
        ## global fenMsgBox
        fenMsgBox = Toplevel()
    - W

  3. #3
    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
    Bonjour Wiztricks,

    Merci, ça marche nickel, j'ai du mal à comprendre, car lorsque je l'appelle une 2ème fois, je recrée bien la fenêtre de nouveau dans ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        #   Création fenêtre
        fenMsgBox.title(titre)
        fenMsgBox.configure(bg="Slate Gray")
        fenMsgBox.geometry('300x360')

  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
    Je viens de comprendre, je l'ai instancié avant la fonction, donc si je comprends bien toutes ces lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import os.path
    from os import chdir        # Pour chargement des images dans autre répertoire chdir = chg de répertoire
    from tkinter import *
    #   Instancification
    fenMsgBox = Toplevel()#Tk()+
    qui se trouvent avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def foncFenAlerte1Choix(titre, msg):
        """MsgBox d'alerte, un seul choix : fermeture"""
        #   Constantes
        fenMsgBox = Toplevel()
    sont inutiles car déja dans le code qui appelle la fonction !

  5. #5
    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
    pour les 3 1ère lignes et de toute façon elles ne sont pas lu si je comprends bien

  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
    J'ai rien dit, je faisais mes tests avec mes print, donc si il faut ces lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import os.path
    from os import chdir        # Pour chargement des images dans autre répertoire chdir = chg de répertoire
    from tkinter import *
    C'est juste instanciation (si ça se dit comme ça) qui n'était pas à la bonne place

    Merci pour tout

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

Discussions similaires

  1. msg d'erreur inconnue
    Par ricachu dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 02/08/2006, 10h56
  2. Réponses: 4
    Dernier message: 19/06/2006, 17h02
  3. Msg d'erreur à l'ouverture d'un fichier
    Par climz dans le forum Access
    Réponses: 2
    Dernier message: 01/06/2006, 08h14
  4. Msg d'erreur: Erreur de traduction. Valeur hors des limites
    Par Zoilus dans le forum Bases de données
    Réponses: 5
    Dernier message: 20/12/2005, 16h15
  5. [msg d'erreur] lors d'un export
    Par Cyber@l dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 01/07/2004, 09h55

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