Python 3.4:getch() - 打字机 - Python

Python 3.4: getch() - A Typewriter - Python

主要问题,对于我的 python 程序的构建方式,我正在尝试为我的程序构建一个打字机,当按下一个键时它会像 GUI 一样刷新。但是,我遇到了一个关于 ASCII 的奇怪问题,尤其是退格键。

from msvcrt import getch
import os
#Test
# Always run in Python CMD
myinput = ""
Finished = False
while Finished != True:
    os.system('cls')
    print("Name: " + myinput)
    while True:
        key = ord(getch())
        realkey = chr(key)
        print(key)
        if key != 0:
            if key == 13: #Enter
                Finished = True
                break
            else:
                myinput = myinput + realkey
                break

当你在迷你打字机上打字时,你打错了,你按了退格键,看起来它什么也没做,但是当你再次按一个键时,奇怪的是它会覆盖字符,这取决于你输入了多少次退格,甚至如果你退格比你输入的更多,它甚至会扼杀,它实际上会覆盖控制台输出。我确定这不是我的块中的错误,这就是 ASCII 的工作原理。

P
>Name: P
y
>Name: Py
t
>Name: Pyt
h
>Name: Pyth
o
>Name: Pytho
n
>Name: Python
(Backspace)
>Name: Python
(Backspace)
>Name: Python
(Backspace)
>Name: Python
K
>Name: PytKon
#See?!    |

为什么?以及如何解决此错误?有没有更清洁的方法来做我正在做的事情?但它必须以我已经完成的 GUI 样式完成。 (如果有道理)

另外,我知道这个 getch() 应该捕获我输入的所有内容,但是有没有办法只捕获正确的字符(基本上我希望我的打字像 input() )而不必 if 条件每一个非法字符?

谢谢。

我猜您正在使用 curses 库。如果你是, 您可以使用 from curses import ascii 获取的 ASCII 值 人物。在这种情况下,您可以使用 ascii.DEL 来获取值 退格键:127。退格键通常用 \b。只需尝试在 Python shell 中输入 print("foo\b\b")。你 将看到打印了整个字符串。如果你这样做 print("foo\b\bf"),不过,ffo 被打印出来了。这是因为 \b字符只是将光标向左移动一个字符。它 实际上不会用空格覆盖字符以从中删除它们 屏幕。您需要将退格字符视为特殊字符:

myinput = ""
Finished = False
while Finished != True:
    os.system('cls')
    print("Name: " + myinput)
    while True:
        key = ord(getch())
        realkey = chr(key)
        print(key)
        if key != 0:
            if key == 13: #Enter
                Finished = True
            elif key == ascii.DEL:
                myinput = myinput[:-1]
            else:
                myinput += realkey
            break

编辑:OP实际使用的代码:

from msvcrt import getch
import os

Finished = False
mydict = "" ## my_dict has no special value, just decided to call it that.

while Finished != True:
    while True:
        key = ord(getch())
        realkey = chr(key)
        if key != 0:
            if key == 13: #Enter
                Finished = True
                break
            elif key == 8: #Backspace
                my_dict[CurrentItem] = my_dict[CurrentItem][:-1]
                break
            elif key in range(32, 127):
                my_dict[CurrentItem] += realkey
                break