[PYTHON] Phänomen, dass Zeichen verschwinden, wenn versucht wird, ein Zeichen ohne Eingabe einzugeben

Ich möchte ein Zeichen eingeben

Die input () -Funktion wird nur gelesen, wenn Sie die Eingabetaste drücken. Ich möchte das Drücken der Eingabetaste weglassen. Also suchte ich nach einer Möglichkeit, die Eingabetaste nicht zu drücken.

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)

Es scheint, dass dies für Mac gemacht werden kann Referenzquelle: https://torina.top/detail/428/

Lauf

while True:
    print('Eingang:',end='')
    key = getch()
    print(key)
#Endet mit esc
    if key == chr(27):
        break

Die Buchstaben verschwinden!

Eingabe: a
Eingabe: f
[Maus hier]

Ich war in der Lage ... ** Input: ist verschwunden! !! ** ** **

(Wenn ich ein Zeichen eingebe, erscheint es plötzlich und es fühlt sich an, als wäre es von Anfang an da)

Ziel

Eingang:[Maus hier]

Ich möchte, dass Du

Fazit

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

Wenn Sie das \ r an der Stelle platzieren, an der Sie es nicht löschen möchten, ist die Eingabe: nicht verschwunden! !! Ich bin mir nicht sicher warum, aber es ist das Ergebnis von Versuch und Irrtum. Anscheinend sollten Sie Zeichen wie "\ r" und "\ n" vor "getch ()" in die Zeichenfolge einfügen.

Es scheint notwendig zu sein, die Ausgabe zu erzwingen (Addition)

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

Ich konnte es anzeigen. Alles wird nicht auf dem Bildschirm angezeigt, bis der Zeilenumbruch ausgegeben wird. Wenn Sie "print (" key: ", end =") an einer anderen Stelle ausführen, wird es ohne Zeilenumbrüche ausgegeben, sodass es sich in einem unordentlichen Zustand befindet. ..

Ich denke, ich kann damit verschiedene Dinge tun

s = []
while 1:
    print('\r'+''.join(s), end='')
    char = getch()
#Endet mit esc
    if char == chr(27):
        break
#Wenn Sie die Eingabetaste drücken\Ist r eingegeben? Ignorieren, da sich der Cursor am linken Ende befindet
    elif char == chr(13):
        continue
#Löschen Sie ein Zeichen mit Rücktaste
    elif char == chr(127):
        if len(s) != 0:
            s.pop()
            print('\b ',end='')
        continue
    s.append(char)
print('')

Jetzt tippe ich jeweils ein Zeichen, konnte es aber jedes Mal anzeigen! Wenn Sie etwas mehr Verarbeitung hinzufügen, können Sie gleichzeitig mit der Eingabe von Klein- in Großbuchstaben konvertieren! Beeindruckend!

Recommended Posts

Phänomen, dass Zeichen verschwinden, wenn versucht wird, ein Zeichen ohne Eingabe einzugeben
[GNOME] So vermeiden Sie das Problem, dass Konvertierungskandidaten beim Konvertieren in Japanisch nicht verschwinden
Memorandum Regulärer Ausdruck Wenn die Zeichenfolge mehrere Zeichen enthält, die Sie trennen möchten
UnicodeEncodeError beim Versuch, Radon auszuführen
Eine Geschichte, die unter einem Unterschied im Betriebssystem litt, als sie versuchte, ein Papier zu implementieren