Filedialog tkinter modifier mot.
RésoluPhil_1857 Messages postés 1883 Date d'inscription Statut Membre Dernière intervention -
j'ai crée un programme de texte sauvegarder, ouvrir, fermer etc...
mais je veut crée une commande qui permet de lire le texte et remplacer par exemple maman par papa (un txt) avec filedialog mais cela me crée des erreurs.
voici une partie de mon programme si vous souhaiter des informations complémentaire dite le moi.
def cherche():
cherche_file = filedialog.askopenfilename(initialdir="/Users/", title="Ouvrir txt", filetypes=(("Text Files,", "*.txt"),))
cherche_file = open(cherche_file, 'r')
ia = cherche_file.read()
my_text.insert(END, ia)
def sauvegarder():
cherche_file = filedialog.askopenfilename(initialdir="/Users/", title="Ouvrir txt",filetypes=(("Text Files,", "*.txt"),))
cherche_file = open(cherche_file, 'w')
cherche_file.write(my_text. get(1.0, END))
def ZRC():
Directory = filedialog.askopenfilename(initialdir=r"C:\Desktop", title="Ouvrir",
filetypes=(("Text Files", "*.txt"),
("Python Files", "*.py"),
("all files", "*.*")))
name = PureWindowsPath(Directory).name
file = open(name, "r")
print(name)
lignes = file.readlines()
lignes[2] = "test \n"
name = name.replace("maman", "papa")
file = open(name, "w")
file.writelines(lignes)
file.close()
23 réponses
- 1
- 2
Plusieurs échanges portent sur l'implémentation d'une commande Python Tkinter qui lit un fichier texte via filedialog et remplace un mot (par exemple 'maman' par 'papa'). Des extraits de code montrent l'usage de filedialog pour ouvrir et sauvegarder, des chemins et des messages d'erreur comme FileNotFoundError lorsque le nom de fichier n'est pas trouvé. Des propositions évoquent des corrections d indentation, la gestion d'un fichier temporaire et la vérification du chemin affiché par la boîte de dialogue pour éviter les erreurs d'ouverture. Enfin, un point utile est de tester le chemin retourné et d'employer des contextes 'with' pour ouvrir les fichiers, afin de garantir la fermeture même en cas d'exception.
L'indentation étant importante en Python, merci de re poster ton code complet avec les balises de code
mode d'emploi:
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Visuellement, ça doit ressembler à ceci :
def test():
print('test')
test()
tu vois bien que visuellement, ton code ne ressemble pas du tout à l'exemple que je t'ai donné !
(couleurs, indentations, ...)
il faut faire exactement ce qui est dit dans le mode d'emploi dont je te donne le lien !
import tkinter
from tkinter import *
from tkinter import filedialog
from pathlib import PureWindowsPath
def show_about():
about_window = tkinter.Toplevel(window)
about_window.title("Information")
lb = tkinter.Label(about_window, text="Cette application a été crée par Toute utilisation non autorisé est un délit et punis, le logiciel est proteger par 'article L. 113-1 du Code de la propriété intellectuelle et article L112-2,\n les œuvres encadrées par la protection accordée par le droit d’auteur, parmi lesquelles on compte les logiciels ")
lb.pack()
#def 2
def show_about1():
about1_window = tkinter.Toplevel(window)
about1_window.title("Help")
lb = tkinter.Label(about1_window, text=" Si Erreur Réinstaller l'application, sinon contacter au ")
lb.pack()
def cherche():
cherche_file = filedialog.askopenfilename(initialdir="/Users/", title="Ouvrir txt", filetypes=(("Text Files,", "*.txt"),))
cherche_file = open(cherche_file, 'r')
ia = cherche_file.read()
my_text.insert(END, ia)
def sauvegarder():
cherche_file = filedialog.askopenfilename(initialdir="/Users/", title="Ouvrir txt",filetypes=(("Text Files,", "*.txt"),))
cherche_file = open(cherche_file, 'w')
cherche_file.write(my_text. get(1.0, END))
def ZRC():
Directory = filedialog.askopenfilename(initialdir=r"C:\Desktop", title="Ouvrir",
filetypes=(("Text Files", "*.txt"),
("Python Files", "*.py"),
("all files", "*.*")))
name = PureWindowsPath(Directory).name
file = open(name, "r")
print(name)
lignes = file.readlines()
lignes[2] = "test \n"
name = name.replace("maman", "papa")
file = open(name, "w")
file.writelines(lignes)
file.close()
window = tkinter.Tk()
window.title("test")
window.geometry("1080x720")
window.minsize(480, 360)
window.positionfrom("user")
label_welcome = tkinter.Label(window, text="Version 1.0", font=("Arial", 30))
label_welcome.pack()
#Exporter et importer
mainmenu = tkinter.Menu(window)
first_menu = tkinter.Menu(mainmenu, tearoff=0)
first_menu.add_command(label='Importer', command=cherche)
my_text = Text(window, width=40, height=30, font=("Helvetica", 16))
my_text.pack(pady=20)
first_menu.add_command(label='Sauvegarder', command=sauvegarder)
first_menu.add_command(label="Quitter", command=window.quit)
second_menu = tkinter.Menu(mainmenu, tearoff= 0)
second_menu.add_command(label="Information", command=show_about)
second_menu.add_command(label="Help", command=show_about1)
tree_menu = tkinter.Menu(mainmenu, tearoff=0)
tree_menu.add_command(label="ZRC", command=ZRC)
mainmenu.add_cascade(label="Fichier", menu=first_menu)
mainmenu.add_cascade(label="Autre", menu=second_menu)
mainmenu.add_cascade(label="Exporter", menu=tree_menu)
window.config(menu=mainmenu)
window.mainloop()
Par contre il manque des indentations:
def sauvegarder():
cherche_file = filedialog.askopenfilename(initialdir="/Users/", title="Ouvrir txt",filetypes=(("Text Files,", "*.txt"),))
cherche_file = open(cherche_file, 'w')
cherche_file.write(my_text. get(1.0, END))
c'est plutot comme ça :
def sauvegarder():
cherche_file = filedialog.askopenfilename(initialdir="/Users/", title="Ouvrir txt",filetypes=
(("Text Files,", "*.txt"),))
cherche_file = open(cherche_file, 'w')
cherche_file.write(my_text. get(1.0, END))
Et c'est quoi le message d'erreur, exactement ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionException in Tkinter callback
Traceback (most recent call last):
File "C:\Users\****\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", [https://www.commentcamarche.net/download/telecharger-34098305-line line] 1885, in __call__
return self.func(*args)
File "C:\Users\****\PycharmProjects\FREDproject\fenetre.py", line 38, in ZRC
file = open(name, "r")
FileNotFoundError: [Errno 2] No such file or directory: '13915 (5) - Copie.txt'
file = open(name, "r")
Apparemment, name est égal à : '13915 (5) - Copie.txt' :
FileNotFoundError: [Errno 2] No such file or directory: '13915 (5) - Copie.txt'
(fichier non trouvé pas de fichier ou de répertoire '13915 (5) - Copie.txt')
Ca m'étonnerais que tu aie un nom de chemin+fichier nommé comme ça comme ça sur ton pc ....
Chez moi ca ressemble plutot à ça:
'C:\Phil\dev\python\copie.txt'
Ce n'est pas le dossier en fait, c'est le fichier qui s'appelle "13915 (5) - Copie.txt"
Moi, quand je vais chercher un fichier à ouvrir dans un dossier, je fais comme ça:
file_name = askopenfilename(initialdir ="/Users/",filetypes =(("Text File", "*.txt"),("All Files","*.*")),title = "Selectionner fichier txt")
et dans file_name, j'ai bien le chemin et le nom: 'C:\Phil\dev\python\copie.txt'
donc
file = open(file_name, "r")ouvre mon fichier
Je pense que tu n'as pas besoin de PureWindowsPath(Directory).name, c'est ça qui met le bazar....
en fait, il te te manque pas de lignes, il y en a plutot en trop
def ZRC():
Directory = filedialog.askopenfilename(initialdir=r"C:\Desktop", title="Ouvrir",
filetypes=(("Text Files", "*.txt"),
("Python Files", "*.py"),
("all files", "*.*")))
file = open(Directory, "r")
lignes = file.readlines()
lignes[2] = " \n"
lignes[3] = " \n"
lignes[6] = " \n"
lignes[7] = " \n"
lignes[8] = " \n"
lignes[9] = " \n"
lignes[10] = " \n"
lignes[11] = " \n"
lignes[12] = " \n"
lignes = file.read()
lignes = lignes.replace("[ENTETE]", "TI")
lignes = lignes.replace("TYPE = LIVRAISON", "Réception")
lignes = lignes.replace("NO BDL =", "Z")
lignes = lignes.replace("DAT BDL", "ZRC")
lignes = lignes.replace("DAT LIV =", " ")
lignes = lignes.replace("[LIGNES]", "LI;ARTICLE")
lignes = lignes.replace("REF FOU", "BRA")
lignes = lignes.replace("QTE =", " ")
lignes = lignes.replace("PA BRUT", " ")
lignes = lignes.replace("REMISE", " ")
lignes = lignes.replace("PV TTC", " ")
lignes = lignes.replace("TVA", " ")
lignes = lignes.replace("LIBELLE =", "A01D;")
lignes = lignes.replace("GENCOD = ", "FAUX")
file = open(Directory, "w")
file.writelines(lignes)
file.close()
Un dossier, c'est un répertoire, comme 'c:\Phil\dev\'
C'est le fichier qui se vide !
Déjà, ca ne change pas grand chose, mais remplace donc le nom Directory par nom_fichier, car directory, en anglais, = dossier ou répertoire, c'est un fichier que l'on sélectionne
Ensuite, voila ce que fait ton code actuellement:
ouvrir le fichier en lecture
lire tout le fichier d'un coup avec file.readlines
modifier des lignes
lire une seule ligne avec file.read()
remplacer des trucs
ouvrir à nouveau le fichier mais en écriture, sans l'avoir fermé
y écrire le contenu de lignes
fermer le fichier
C'est un peu le bazar, non ?
Finalement, que veux tu faire exactement ?
Lire le fichier, remplacer des trucs et le sauvegarder comme ça avec le meme nom ?
Je te donne une méthode plus sure:
ouvrir temporaire.txt en écriture
ouvrir ton fichier en lecture
lire les lignes de ton fichier et y remplacer les textes
écrire les lignes modifiées dans temporaire.txt
fermer temporaire et ton fichier
détruire ton fichier
renommer temporaire .txt avec le nom de ton fichier
et là, il ne reste plus que ton fichier modifié...
Je dois supprimer la ligne 3 et 4 puis 7 à 13 puis encore ensuite je dois remplacer tout ses mot dans le Fichier exemple :
[ENTETE] (il doit devenir TI)
blabla
tu dois supprimer cette ligne ( je dois supprimer)
tu dois supprimer cette ligne (je dois supprimer)
TYPE = LIVRAISON (doit devenir Réception)
ETC...
puis sauvegarder le fichier
import os
fi = open(mon_fichier, 'r')
fo = open('tempo.txt','w')
for ligne in fi:
if('[ENTETE]' in ligne): ligne.replace('[ENTETE]', 'TI')
fo.write(ligne)
fi.close()
fo.close()
os.remove(mon_fichier)
os.rename('tempo.txt', mon_fichier)
import os
fi = open("13915 (5).txt", 'r')
fo = open('tempo.txt','w')
for ligne in fi:
if('[ENTETE]' in ligne): ligne.replace('[ENTETE]', 'TI')
fo.write(ligne)
fi.close()
fo.close()
os.remove("13915 (5).txt")
os.rename('tempo.txt', "13915 (5).txt")
mon code ne marche pas ?
chez moi, si
tu as un message d'erreur ? et lequel ?
fi = open("13915 (5).txt", 'r') : tu n'as pas oublié le chemin devant le nom de fichier ?
genre 'C:\\phil\\dev\\13915(5).txt' ???
je n'est aucune erreur juste il ne se passe rien et si je met le chemin
", line 3
fi = open("C:\Users\Paul\PycharmProjects\FREDproject\Nouveau dossier\test.txt", 'r')
^
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
le fichier test.txt contient ceci:
toto
[ENTETE]
tagada
le code:
from tkinter.filedialog import askopenfilename
import os
def ZRC():
mon_fichier = askopenfilename(initialdir ="C:/Phil/dev/python",filetypes =(("Text File", "*.txt"),("All Files","*.*")),title = "Selectionner fichier txt")
fi = open(mon_fichier, 'r')
fo = open('tempo.txt','w')
for ligne in fi:
if('[ENTETE]' in ligne):
print(ligne)
ligne = ligne.replace('[ENTETE]', 'TI')
fo.write(ligne)
fi.close()
fo.close()
os.remove(mon_fichier)
os.rename('tempo.txt', mon_fichier)
ZRC()
input('appuyer sur entrée ...')
le fichier test.txt après exécution:
toto
TI
tagada
essaie juste ça pour voir ...
déjà, dis-moi si mon dernier code avec un fichier de test comme je l'ai fait fonctionne ...
from tkinter.filedialog import askopenfilename
import os
def ZRC():
mon_fichier = askopenfilename(initialdir ="C:/Phil/dev/python",filetypes =(("Text File", "*.txt"),("All Files","*.*")),title = "Selectionner fichier txt")
fi = open(mon_fichier, 'r')
fo = open('tempo.txt','w')
for lignes in fi:
if('[ENTETE]' in lignes):
lignes = lignes.replace('[ENTETE]', 'TI')
lignes = lignes.replace("TYPE = LIVRAISON", "Réception")
lignes = lignes.replace("NO BDL =", "Z")
lignes = lignes.replace("DAT BDL", "ZRC")
lignes = lignes.replace("DAT LIV =", " ")
lignes = lignes.replace("[LIGNES]", "LI;ARTICLE")
lignes = lignes.replace("REF FOU", "BRA")
lignes = lignes.replace("QTE =", " ")
lignes = lignes.replace("PA BRUT", " ")
lignes = lignes.replace("REMISE", " ")
lignes = lignes.replace("PV TTC", " ")
lignes = lignes.replace("TVA", " ")
lignes = lignes.replace("LIBELLE =", "A01D;")
lignes = lignes.replace("GENCOD = ", "FAUX")
print(lignes)
fo.write(lignes)
fi.close()
fo.close()
os.remove(mon_fichier)
os.rename('tempo.txt', mon_fichier)
ZRC()
input('appuyer sur entrée ...')
mais bizarrement il fait le TI mais refuse de faire la suite il ignore les autres lignes.
if('[ENTETE]' in lignes):
lignes = lignes.replace('[ENTETE]', 'TI')
lignes = lignes.replace("TYPE = LIVRAISON", "Réception")
tu ne fait les remplacements que si la ligne lue dans le fichier contient [ENTETE]
donc forcement, ca ne marche que si il y a [ENTETE] dans la ligne !
Je te rappelle que la boucle for sert a lire ligne par ligne
et donc ta variable lignes contient une seule ligne à chaque tour de boucle ...
je ne sais pas si c'est juste mais je pense qu'il me manque des chose
def ZRC():
mon_fichier = askopenfilename(initialdir ="C:/Phil/dev/python",filetypes =(("Text File", "*.txt"),("All Files","*.*")),title = "Selectionner fichier txt")
fi = open(mon_fichier, 'r')
fo = open('tempo.txt','w')
for lignes in fi:
if('[ENTETE]' in lignes):
if ("TYPE = LIVRAISON" in "Réception"):
if ("NO BDL ="in "Z"):
if lignes.replace("DAT BDL" in "ZRC"):
if("DAT LIV ="in " "):
if("[LIGNES]"in "LI;ARTICLE"):
if("REF FOU"in "BRA"):
if("QTE ="in " "):
if("PA BRUT"in " "):
if("REMISE"in " "):
if("PV TTC"in " "):
if("TVA"in " "):
if("LIBELLE ="in "A01D;"):
if("GENCOD = "in "FAUX"):
print(lignes)
fo.write(lignes)
fi.close()
fo.close()
os.remove(mon_fichier)
os.rename('tempo.txt', mon_fichier)
ZRC()
input('appuyer sur entrée ...')
rappelle toi qu'on lit une ligne dans le fichier initial, on la modifie (ou pas) et on la copie
dans tempo
donc, supprimer une ligne, c'est tout simplement ne pas la recopier dans tempo
donc une fois identifiée la ligne, sauter le code
fo.write(lignes)
avec un if
for lignes in fi:
if ('[ENTETE]' in lignes): lignes = lignes.replace('[ENTETE]', 'TI')
if ("TYPE = LIVRAISON" in lignes): lignes = lignes.replace("TYPE = LIVRAISON", "Reception")
if ("NO BDL =" in lignes): lignes = lignes.replace("NO BDL =", "Z")
if ("DAT BDL" in lignes): lignes = lignes.replace("DAT BDL" , "ZRC")
if("DAT LIV ="in lignes): lignes = lignes.replace("DAT LIV =", " ")
if("[LIGNES]"in lignes): lignes = lignes.replace("[LIGNES]", "LI;ARTICLE")
if("REF FOU"in lignes): lignes = lignes.replace("REF FOU", "BRA")
if("QTE ="in lignes): lignes = lignes.replace("QTE =", " ")
if("PA BRUT"in lignes): lignes = lignes.replace("PA BRUT", " ")
if("REMISE"in lignes): lignes = lignes.replace("REMISE", " ")
if("PV TTC"in lignes): lignes = lignes.replace("PV TTC", " ")
if("TVA"in lignes): lignes = lignes.replace("TVA", " ")
if("LIBELLE ="in lignes): lignes = lignes.replace("LIBELLE =", "A01D;")
if("GENCOD = "in lignes): lignes = lignes.replace("GENCOD = ", "FAUX")
for lignes in fi :
if ([2] in lignes): lignes.replace('.\n')
- 1
- 2