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 ?