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
主要问题,对于我的 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