Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 17/01/2023, à 22: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 smile )

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, à 21:38)


Je suis un homme, quoi de plus naturel en somme ?
linux on the rocks

Hors ligne

#2 Le 17/01/2023, à 22: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, à 05: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, à 05:15)

#4 Le 18/01/2023, à 06:06

MicP

Re : [Résolu] caractères accenctués python + curses

Bonjour

J'ai une fois eu besoin de compiler (c'était pas du python) une application qui utilisait ncurses : calcurse et j'ai aussi été très désagréablement déçu.
Mais j'ai découvert qu'il existait aussi ncursesw

Dernière modification par MicP (Le 30/01/2023, à 12:59)

Hors ligne

#5 Le 23/01/2023, à 21: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 smile 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, à 22: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, à 13:55

Compte supprimé

Re : [Résolu] caractères accenctués python + curses

Bonjour,

joko a écrit :

Au risque de passer pour un traître smile merci à... chatgpt (encore une fois).

Ingrât va! tongue
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, à 21:24

joko

Re : [Résolu] caractères accenctués python + curses

@MPython Alaplancha
Merci de votre sollicitude, mais en tant que grosse faignasse smile 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