Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
1175 connectés 

  FORUM HardWare.fr
  Programmation
  Python

  Problème de caractères spéciaux tkinter et fichier texte (Resolu)

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème de caractères spéciaux tkinter et fichier texte (Resolu)

n°2333687
funisup
Posté le 18-05-2019 à 10:47:21  profilanswer
 

Bonjour à tous,
 
Pour exprimer clairement le soucis que j'ai (ou essayer d'exprimer clairement  :sweat: ) voilà le problème:
J'ai écrit un programme d'automatisation de compte-rendu censé me faire gagner du temps. Ce programme récupère dans une interface graphique codée avec tkinter des données entrées par l'utilisateur et qui peuvent contenir des caractères spéciaux (dans l'exemple le nom d'une personne, disons Kévin). Cette interface est faite de telle façon que dans la zone de texte où les données doivent être entrées, l'information demandée est décrite et peux contenir des caractère spéciaux aussi (dans l'exemple "Espèce" ). Enfin ces données sont utilisées pour compléter un compte-rendu vierge, contenant déjà des caractères spéciaux, et dans lequel je dois entrer les caractères spéciaux donnés  par l'utilisateur.
 
Le problème que je rencontre est que je n'arrive pas à gérer tout ces caractères: ils s'affichent en "?" soit dans l'interface graphique, soit dans le fichier texte.
Qu'est ce que je rate dans mon code, ou qu'est ce que je devrais ajouter pour avoir un affichage correct sur mon interface graphique ET dans le fichier .txt final?
Là où je suis encore plus perdu c'est que les données "par défaut" que j'ai moi-même données dans le code (exemple "Espèce", ligne 116) sont affichées sans erreur dans le fichier .txt, mais pas ceux rentrés par l'utilisateur...
(Le code donné en dessous est une grosse simplification du code pour le rendre plus compréhensible, mais fonctionne exactement comme mon code d'origine)
PS: Je suis sous windows, python3.7.
PSS: J'espère avoir été clair dans mon explication  :pt1cable:  
Merci d'avance pour votre aide!  :hello:  
 
 
 

Code :
  1. # -*- coding: iso-8859-1 -*-
  2. from tkinter import  Button, StringVar,Entry, Tk, RAISED
  3. from functools import partial
  4. class InfoPersonne:
  5.     def __init__(self):
  6.         """Constructeur de la classe et de ses attributs"""
  7.         self.nom="Non renseigné"
  8.         self.espece = "Non renseigné"
  9.     def constructDico(self):
  10.         '''Cette fonction construit l'index des mots clés du compte-rendu vierge associés aux données qui devront le remplacer dans le compte-rendu final'''
  11.         self.indexDeRemplacement = {'&InfoNom':self.nom, '&InfoEspece':self.espece}
  12. def redactionCR(index, contenu):
  13.     '''Cette fonction gère la modification du texte du CR vierge avec les données récupérées'''
  14.     for cle in index:
  15.         if contenu.find(cle) != -1:
  16.             contenu = contenu.replace(cle, index[cle])
  17.         else:
  18.             print("clé non trouvée" )
  19.     return contenu
  20. def save():
  21.     '''Cette fonction sauvegarde les valeurs d'entrées'''
  22.     personne.nom=nomVariable.get()
  23.     personne.espece=espVariable.get()
  24.        
  25. def creationPersonne():
  26.     '''Cette fonction gère la recueil des données et de l'index'''
  27.     personne = InfoPersonne()
  28.     personne.constructDico()
  29.     global index
  30.     index = personne.indexDeRemplacement
  31.     return personne, index
  32. def majPersonne():
  33.     '''Cette fonction met à jour les données de la personne'''
  34.     save()
  35.     personne.constructDico()
  36.     index = personne.indexDeRemplacement
  37.     creationFichierCR(personne, index)
  38.    
  39. def creationFichierCR(personne, index):
  40.     '''Cette fonction gère la rédaction du CR'''
  41.     nomFichier = personne.nom+".txt"
  42.     fichier = open('CR_Vierge.txt', 'r')
  43.     contenu = fichier.read()
  44.     fichier.close()
  45.     contenu = redactionCR(index, contenu)
  46.     contenu=u'%s' % (contenu)
  47.     fichier = open(nomFichier, 'w')
  48.     fichier.write(contenu)
  49.     fichier.close()
  50. def resetTexte(variable,event):
  51.     '''Permet d'effacer le champ de texte d'une entry quand on clique dessus'''
  52.     variable.set('')
  53.    
  54.    
  55. personne, index = creationPersonne()
  56.    
  57. #'''Création de la fenêtre, redimensionnement en fonction de l'écran, et centrage'''
  58. fenetre = Tk() #Création de la fenetre
  59. X = fenetre.winfo_screenwidth()
  60. Y = fenetre.winfo_screenheight()
  61. fenetre.title("CR_Maker" )
  62. fenetre.geometry("%dx%d" % (X,Y))
  63. fenetre.grid()
  64. #'''Création des variables des champs de saisies'''
  65. nomVariable = StringVar()
  66. espVariable = StringVar()
  67. #'''Création bouton save'''
  68. saveBouton=Button(fenetre, text="Save", bg = "light gray", relief = RAISED, command = majPersonne)
  69. saveBouton.grid(column=3,row=0)
  70. #'''Crée les entrées et les lie à la fonction qui reset le texte quand on entre dans le champ de saisi'''
  71. nomEntry = Entry(fenetre,textvariable=nomVariable)
  72. nomEntry.bind('<ButtonPress>', partial(resetTexte,nomVariable))
  73. espEntry = Entry(fenetre,textvariable=espVariable)
  74. espEntry.bind('<ButtonPress>', partial(resetTexte,espVariable))
  75. #'''Assigne le texte par défaut des entrées'''
  76. nomVariable.set("Nom" )
  77. espVariable.set("Espèce" )
  78. #'''Packing des entrées'''
  79. nomEntry.grid(column=3,row=1)
  80. espEntry.grid(column=0,row=2)
  81. fenetre.mainloop()


 
https://www.casimages.com/i/190518103856929532.gif.html
https://www.casimages.com/i/19051810385719580.gif.html
https://www.casimages.com/i/190518103857278046.gif.html


Message édité par funisup le 18-05-2019 à 19:20:28
mood
Publicité
Posté le 18-05-2019 à 10:47:21  profilanswer
 

n°2333695
rat de com​bat
attention rongeur méchant!
Posté le 18-05-2019 à 15:36:56  profilanswer
 

Je connais pas Python, mais ton problème c'est un de ces soucis d'encodage. Tu as cherché "Python activer Unicode" ou quelque chose du genre?

n°2333697
funisup
Posté le 18-05-2019 à 15:48:48  profilanswer
 

C'est bien ce qu'il me semble, et après mes recherches j'avais essayé divers encodages:
-quand je mets le # -*- coding: utf-8 -*- (qui doit correspondre à unicode (Unicode Transformation Format si je me trompe pas) l'affichage sur Tkinter est bon, les caractères spéciaux sont affichés correctement. Par contre le fichier texte l'est encore moins: les données entrées par l'utilisateur sont mal encodées comme avant (par exemple K?vin), et les données par défaut ("Espèce" ligne 116) qui étaient affichées normalement dans le .txt sont maintenant mal encodées aussi ("Esp?ce" )...
J'arrive pas à jongler entre les différents encodages, savoir lequel mettre dans quel situation, donc je dois louper quelque chose, une info que j'aurais pas trouvée sur le net :heink:


Message édité par funisup le 18-05-2019 à 15:50:16
n°2333698
rat de com​bat
attention rongeur méchant!
Posté le 18-05-2019 à 15:57:44  profilanswer
 

Si je crois ma recherche rapide pour Python3 il ne faut plus spécifier Unicode, c'est le cas par défaut (pour ton fichier texte). Après il faut peut-être repréciser que les "inputs" et/ou ton fichier de sortie sont aussi du UTF-8? Tu es bien sûr d'appeller Python3 si tu as les deux d'installés? :o

n°2333699
funisup
Posté le 18-05-2019 à 19:19:36  profilanswer
 

Alors pour Python, oui je suis bien en Python3, j'avais pris soin de désinstaller le précédent. Et tu as trouver la solution, le problème venait de l'encodage du fichier texte vierge. Donc je mets ce post en [résolu].  
 
Merci beaucoup pour ton aide en tout cas, j'avais pas pensé que l'encodage en UNICODE plutôt que ANSI du .txt soit un problème pour python :pt1cable:
 
Pour les prochains qui chercheraient une solution ici, enregistrer le fichier texte d'origine en ANSI, et préciser au début du code l'encoding en utf-8

n°2333700
rat de com​bat
attention rongeur méchant!
Posté le 18-05-2019 à 19:50:23  profilanswer
 

Oui ces histoires d'encodage ça peut être vachement casse-c... :o


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

  Problème de caractères spéciaux tkinter et fichier texte (Resolu)

 

Sujets relatifs
Script qui récupère données fichier Excel vers documentPHP Trier un fichier csv volumineux
Problème inclusion librairie arduinoontroler la présence d'un fichier par son extension et sortir en code
Afficher le contenu d'un fichier log dans une page HTMLCode fichier php est-il accessible depuis un navigateur ? Protection ?
Trier un fichier trace[Python]Problème de split.
Envoyer un message après le send d'une fichier via socketProblème pour créer une plateforme de conversion de monnaie avec vba
Plus de sujets relatifs à : Problème de caractères spéciaux tkinter et fichier texte (Resolu)


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR