Phénomène selon lequel les caractères disparaissent lors de la tentative de saisie d'un caractère sans Entrée

Je veux saisir un caractère

La fonction input () ne lit pas sauf si vous appuyez sur la touche Entrée. Je veux omettre d'appuyer sur la touche Entrée. J'ai donc cherché un moyen d'éviter d'appuyer sur la touche Entrée.

import sys
import tty
import termios
def getch():
    fd = sys.stdin.fileno()
    old = termios.tcgetattr(fd)
    try:
        tty.setraw(fd)
        return sys.stdin.read(1)
    finally:
        termios.tcsetattr(fd, termios.TCSADRAIN, old)

Il semble que cela puisse être fait pour mac Source de référence: https://torina.top/detail/428/

Courir

while True:
    print('contribution:',end='')
    key = getch()
    print(key)
#Se termine par esc
    if key == chr(27):
        break

Les lettres disparaissent!

Entrée: a
Entrée: f
[Souris ici]

J'étais capable de ... ** ʻInput: `a disparu! !! ** **

(Quand j'entre un caractère, il apparaît soudainement et j'ai l'impression qu'il était là depuis le début)

Cible

contribution:[Souris ici]

je veux que tu sois

Conclusion

while True:
    print('\entrée r:',end='')
    key = getch()
    print(key)
    if key == chr(27):
        break

Si vous mettez le \ r à l'endroit où vous ne voulez pas l'effacer, l'entrée: n'a pas disparu! !! Je ne sais pas pourquoi, mais c'est le résultat d'essais et d'erreurs. Apparemment, vous devriez mettre des caractères tels que \ r et \ n dans la chaîne de caractères avantgetch ().

Il semble qu'il soit nécessaire de forcer la sortie (addition)

print('key :', end='', flush=True)

J'ai pu l'afficher. Tout n'est pas reflété sur l'écran tant que le saut de ligne n'est pas émis, Si vous faites print ('key:', end = '') ailleurs, il sera affiché sans saut de ligne, donc il est dans un état désordonné. ..

Je pense que je peux faire diverses choses avec ça

s = []
while 1:
    print('\r'+''.join(s), end='')
    char = getch()
#Se termine par esc
    if char == chr(27):
        break
#Lorsque vous appuyez sur Entrée\Est-ce que r est entré? Ignorer car le curseur est à l'extrémité gauche
    elif char == chr(13):
        continue
#Supprimer un caractère avec retour arrière
    elif char == chr(127):
        if len(s) != 0:
            s.pop()
            print('\b ',end='')
        continue
    s.append(char)
print('')

Maintenant, je tape un caractère à la fois, mais j'ai pu l'afficher à chaque fois! Si vous ajoutez un peu plus de traitement, vous pouvez convertir des minuscules en majuscules en même temps que vous le frappez! Hou la la!

Recommended Posts

Phénomène selon lequel les caractères disparaissent lors de la tentative de saisie d'un caractère sans Entrée
[GNOME] Comment éviter le problème que les caractères candidats à la conversion ne disparaissent pas lors de la conversion en japonais
Mémorandum Expression régulière Lorsqu'il y a plusieurs caractères que vous souhaitez séparer dans la chaîne de caractères
UnicodeEncodeError lors de la tentative d'exécution du radon
Une histoire qui a souffert d'une différence de système d'exploitation lors de la tentative d'implémentation d'un article