#1 Le 17/01/2023, à 23:20
- joko
[Résolu] caractères accenctués python + curses
Bonjour à tous,
Le programme suivant simule une saisie à la volée (dans le but futur de gérer des touches comme haut et bas [par ex.] pour déclencher des actions [ici la touche "entrée" exécute une commande bash]).
Le principe : on tape un texte avec l'idée de pouvoir s'y "déplacer" et d'ajouter ou supprimer des caractères en début, à l'intérieur ou à la fin de la chaîne (touches droite, gauche, home, fin et backspace).
J'ai écrit ce programme afin d'améliorer l'ergonomie de celui développé par J. Seguillon (acli) intégrant chatpght en mode terminal acli chatpgt
Cependant, j'ai un énorme souci de caractères accentués. J'ai parcouru le net, ai demandé à chatgpt sans résultat.
À la saisie du caractère au clavier "é"
key = win.getch()
me retourne une séquence de caractères que je n'arrive pas à gérer.
Quelle solution envisageriez-vous ?
J'ai essayé de documenter le plus clairement possible (je pense qu'il pourrait servir à d'autres personnes).
Vous remercie par avance de votre attention.
P.s. la partie "import shell" est là à titre indicatif (et désolé si ce post est un chouïa long )
import curses
from shell import * #la fonction shell du programme éponyme récupère au format texte une chaîne issue d'une commande dans le terminal
def main(win):
win.nodelay(False)
key="" #touche appuyée
y=0 #position du curseur ET indicateur de fin de la position debut (d) et début de la position fin (f), la chaîne (ch) étant la réunion de d+touche+f
ch="" #chaîne vide
flag=0 #indique si on a appuyé sur une touche alphanum.(flag=0) ou sur une touche de déplacement (flag=1) dans la chaîne en saisie afin de ne pas intégrer des touches de déplacements comme faisant partie de la chaîne (voir dernier bloc du programme)
d="" #début de chaine
f="" #fin de chaîne
while True:
key = win.getch() #par souci de clarté on a dissocié touche et key
touche=chr(key)
#----------------------si touche entrée on execute une commande shell------------------------
if key==10: #win..getch() retourne la valeur 10 pour la touche entrée
win.clear()
win.refresh()
win.addstr(2,1, "vous avez pressé entrée")
re=shell("date") #on lance une commande du terminal, mais le but c'est d'y placer la chaîne ch
win.addstr(6,1, re)
win.addstr(7,0," chaine (bk)>"+ch)
#on rénitialise les param. de saisie (sauf flag remis à zéro dans le corps du programme
ch=""
d=""
f=""
y=0
#---------------------------------gestion touches--------------------------------------------
elif key == curses.KEY_RIGHT:
y +=1
if y>len(ch):
y=len(ch)
flag=1
d=ch[0:y]
f=ch[y:len(ch)]
win.move(0,y)
#---------------------------------gauche--------------------------------------------------------
elif key == curses.KEY_LEFT:
y -=1
if y==-1:
y=0
flag=1
d=ch[0:y]
f=ch[y:len(ch)]
win.move(0,y)
#---------------------------------fin------------------------------------- -------------------
elif key == curses.KEY_END:
y=len(ch)
#y +=1
d=ch
f=""
flag=1
#--------------------------------home-----------------------------------------------------------
win.move(0,len(ch))
elif key == curses.KEY_HOME:
y=0
flag=1
d=""
f=ch
win.move(0,y)
#--------------------------------backspace------------------------------------------------------
elif key == curses.KEY_BACKSPACE:
y -=1
if y==-1:
y=0
#flag=1
d=ch[0:y]
#fin=ch[y+1:len(ch)]
ch=d+f
win.clear()
win.refresh()
win.addstr(0,0,ch)
win.move(0,y)
#-----------------saisie du texte en fonction de la position du curseur (y)------------------------
else:
if flag==1:
flag=0
win.clear()
y+=1
d=d+touche
ch=d+f
win.addstr(0,0,ch)
win.move(0,y)
curses.wrapper(main)
Dernière modification par joko (Le 23/01/2023, à 22:38)
Je suis un homme, quoi de plus naturel en somme ?
linux on the rocks
Hors ligne
#2 Le 17/01/2023, à 23:25
- Watael
Re : [Résolu] caractères accenctués python + curses
en effet, est-il possible de reproduire le problème avec un code plus court, plus simple ?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 18/01/2023, à 06:14
- Compte supprimé
Re : [Résolu] caractères accenctués python + curses
Bonjour,
manifestement un souci d'encodage**... :
>>> "é".encode("latin1").decode()
'é'
?
** note : Il est préférable de régler ce soucis d'encodage en amont (on doit pouvoir trouver l'info dans a doc de curses)
Dernière modification par Compte supprimé (Le 18/01/2023, à 06:15)
#4 Le 18/01/2023, à 07:06
- MicP
Re : [Résolu] caractères accenctués python + curses
Hors ligne
#5 Le 23/01/2023, à 22:47
- joko
Re : [Résolu] caractères accenctués python + curses
Moyennant quelques petites adaptions, on peut récupérer les caractères non ascii en remplaçant :
key = win.getch()
par :
key = win.get_wch()
Pour les touches non alphanumériques (haut,bas, home etc..) prévoir un traitement adapté.
Au risque de passer pour un traître merci à... chatgpt (encore une fois).
Je suis un homme, quoi de plus naturel en somme ?
linux on the rocks
Hors ligne
#6 Le 23/01/2023, à 23:28
- MicP
Re : [Résolu] caractères accenctués python + curses
Extrait de : http://www.roguebasin.com/index.php/Ncursesw
… The man page tells you that you have to include "curses.h" to get any of the wide-character functions working, but the header that actually contains the wide-character function definitions is "ncursesw/curses.h" …
Hors ligne
#7 Le 24/01/2023, à 14:55
- Compte supprimé
Re : [Résolu] caractères accenctués python + curses
Bonjour,
Au risque de passer pour un traître
merci à... chatgpt (encore une fois).
Ingrât va!
Et nous alors?
Ma réponse comprenait une explication, une solution et une invitation à consulter la doc pour résoudre en amont ton souci d'encodage ...
#8 Le 25/01/2023, à 22:24
- joko
Re : [Résolu] caractères accenctués python + curses
@MPython Alaplancha
Merci de votre sollicitude, mais en tant que grosse faignasse j'ai posé la question au robot qui m'a bien aidé.
Je suis un homme, quoi de plus naturel en somme ?
linux on the rocks
Hors ligne