funisup | Bonjour à tous,
Pour exprimer clairement le soucis que j'ai (ou essayer d'exprimer clairement ) 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 Merci d'avance pour votre aide!
Code :
- # -*- coding: iso-8859-1 -*-
- from tkinter import Button, StringVar,Entry, Tk, RAISED
- from functools import partial
- class InfoPersonne:
- def __init__(self):
- """Constructeur de la classe et de ses attributs"""
- self.nom="Non renseigné"
- self.espece = "Non renseigné"
- def constructDico(self):
- '''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'''
- self.indexDeRemplacement = {'&InfoNom':self.nom, '&InfoEspece':self.espece}
- def redactionCR(index, contenu):
- '''Cette fonction gère la modification du texte du CR vierge avec les données récupérées'''
- for cle in index:
- if contenu.find(cle) != -1:
- contenu = contenu.replace(cle, index[cle])
- else:
- print("clé non trouvée" )
- return contenu
- def save():
- '''Cette fonction sauvegarde les valeurs d'entrées'''
- personne.nom=nomVariable.get()
- personne.espece=espVariable.get()
-
- def creationPersonne():
- '''Cette fonction gère la recueil des données et de l'index'''
- personne = InfoPersonne()
- personne.constructDico()
- global index
- index = personne.indexDeRemplacement
- return personne, index
- def majPersonne():
- '''Cette fonction met à jour les données de la personne'''
- save()
- personne.constructDico()
- index = personne.indexDeRemplacement
- creationFichierCR(personne, index)
-
- def creationFichierCR(personne, index):
- '''Cette fonction gère la rédaction du CR'''
- nomFichier = personne.nom+".txt"
- fichier = open('CR_Vierge.txt', 'r')
- contenu = fichier.read()
- fichier.close()
- contenu = redactionCR(index, contenu)
- contenu=u'%s' % (contenu)
- fichier = open(nomFichier, 'w')
- fichier.write(contenu)
- fichier.close()
- def resetTexte(variable,event):
- '''Permet d'effacer le champ de texte d'une entry quand on clique dessus'''
- variable.set('')
-
-
- personne, index = creationPersonne()
-
- #'''Création de la fenêtre, redimensionnement en fonction de l'écran, et centrage'''
- fenetre = Tk() #Création de la fenetre
- X = fenetre.winfo_screenwidth()
- Y = fenetre.winfo_screenheight()
- fenetre.title("CR_Maker" )
- fenetre.geometry("%dx%d" % (X,Y))
- fenetre.grid()
- #'''Création des variables des champs de saisies'''
- nomVariable = StringVar()
- espVariable = StringVar()
- #'''Création bouton save'''
- saveBouton=Button(fenetre, text="Save", bg = "light gray", relief = RAISED, command = majPersonne)
- saveBouton.grid(column=3,row=0)
- #'''Crée les entrées et les lie à la fonction qui reset le texte quand on entre dans le champ de saisi'''
- nomEntry = Entry(fenetre,textvariable=nomVariable)
- nomEntry.bind('<ButtonPress>', partial(resetTexte,nomVariable))
- espEntry = Entry(fenetre,textvariable=espVariable)
- espEntry.bind('<ButtonPress>', partial(resetTexte,espVariable))
- #'''Assigne le texte par défaut des entrées'''
- nomVariable.set("Nom" )
- espVariable.set("Espèce" )
- #'''Packing des entrées'''
- nomEntry.grid(column=3,row=1)
- espEntry.grid(column=0,row=2)
- fenetre.mainloop()
|
Message édité par funisup le 18-05-2019 à 19:20:28
|