python - msvcrt.getch () registrerer plads hver gang

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg skriver en simpel python kode, der skal registrere min tastetryk, men af ​​en eller anden grund i detekterer plads efter everysingle tastetryk.


Koden:


import msvcrt

print("press 'escape' to quit...")
text=""
while 1:
    char = msvcrt.getch()
    print(ord(char))


Prøvekørsel:


Input: aaaaa

Output:
97
0
97
0
97
0
97
0
97
0

Bedste reference


Det registrerer ikke plads. Rummet er 32, ikke 0.


Hvad der sker, er at du bruger en bredtekst-terminal, men læser den som byte, så du kan se UTF-16-LE bytes. I UTF-16-LE er en a to bytes, 97 og 0. Hvis du læser dem som om de var to ASCII-tegn i stedet for et UTF-16-LE-tegn, får du a efterfulgt af ]].


Bemærk, at hvad du får tilbage, er faktisk ikke 'aaa', men b'aaa'. Så du kunne buffer disse op i en bytes eller bytearray og brug decode('utf-16-le') på den. Men det besejrer formålet med at læse et tegn ad gangen.


Den enkleste løsning er at bruge getwch i stedet for getch. Dette vil for det meste bare gøre, hvad du vil - returnere en enkelt karakter str værdi som 'a' i stedet for to separate single-byte bytes værdier. [24]


Der kan stadig være nogle problemer med astrale tegn (alt over U+FFFF) vises som to separate surrogater i stedet for et enkelt tegn, og 'special keys' vises stadig som Unicode U+0000 eller U+00E0 efterfulgt af en nøglekode (eller, hvis du har en ældre Python, muligvis som en brud U+E0xx med nøglekode indlejret i tegnet). Men ellers fungerer det som forventet.