感觉到 Python 中的向上箭头?
Sense up arrow in Python?
我有这个脚本
import sys, os, termios, tty
home = os.path.expanduser("~")
history = []
if os.path.exists(home+"/.incro_repl_history"):
readhist = open(home+"/.incro_repl_history", "r+").readlines()
findex = 0
for j in readhist:
if j[-1] == "\n":
readhist[findex] = j[:-1]
else:
readhist[findex] = j
findex += 1
history = readhist
del readhist, findex
class _Getch:
def __call__(self):
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(3)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
while True:
try:
cur = raw_input("> ")
key = _Getch()
print key
if key == "\x1b[A":
print "\b" * 1000
print history[0]
history.append(cur)
except EOFError:
sys.stdout.write("^D\n")
history.append("^D")
except KeyboardInterrupt:
if not os.path.exists(home+"/.incro_repl_history"):
histfile = open(home+"/.incro_repl_history", "w+")
for i in history:
histfile.write(i+"\n")
else:
os.remove(home+"/.incro_repl_history")
histfile = open(home+"/.incro_repl_history", "w+")
for i in history:
histfile.write(i+"\n")
sys.exit("")
当运行时,它获取/home/bjskistad/.incro_repl_history
的内容,读取行,并删除换行符,然后定义_Getch
class/function。然后,它 运行 是脚本的主循环。 try
将 cur
设置为 raw_input()
。然后我尝试使用定义的 _Getch
class 来感知向上箭头。这是我遇到麻烦的地方。我无法使用 _Getch
class 感应到向上箭头。我如何使用当前代码感知向上箭头?
raw_input
函数在 ENTER 之前总是读取一个字符串,而不是单个字符(箭头等)
您需要定义自己的 getch
函数,请参阅:Python read a single character from the user。
然后您可以使用 getch` 函数通过循环重新实现 "input" 函数。
下面是一个简单的用法:
while True:
char = getch()
if char == '\x03':
raise SystemExit("Bye.")
elif char in '\x00\xe0':
next_char = getch()
print("special: {!r}+{!r}".format(char, next_char))
else:
print("normal: {!r}".format(char))
在 Windows 下,使用以下键:Hello<up><down><left><right><ctrl+c>
,您将得到:
normal: 'H'
normal: 'e'
normal: 'l'
normal: 'l'
normal: 'o'
special: '\xe0'+'H'
special: '\xe0'+'P'
special: '\xe0'+'K'
special: '\xe0'+'M'
所以箭头对应组合字符:"\xe0H".
我有这个脚本
import sys, os, termios, tty
home = os.path.expanduser("~")
history = []
if os.path.exists(home+"/.incro_repl_history"):
readhist = open(home+"/.incro_repl_history", "r+").readlines()
findex = 0
for j in readhist:
if j[-1] == "\n":
readhist[findex] = j[:-1]
else:
readhist[findex] = j
findex += 1
history = readhist
del readhist, findex
class _Getch:
def __call__(self):
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(3)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
while True:
try:
cur = raw_input("> ")
key = _Getch()
print key
if key == "\x1b[A":
print "\b" * 1000
print history[0]
history.append(cur)
except EOFError:
sys.stdout.write("^D\n")
history.append("^D")
except KeyboardInterrupt:
if not os.path.exists(home+"/.incro_repl_history"):
histfile = open(home+"/.incro_repl_history", "w+")
for i in history:
histfile.write(i+"\n")
else:
os.remove(home+"/.incro_repl_history")
histfile = open(home+"/.incro_repl_history", "w+")
for i in history:
histfile.write(i+"\n")
sys.exit("")
当运行时,它获取/home/bjskistad/.incro_repl_history
的内容,读取行,并删除换行符,然后定义_Getch
class/function。然后,它 运行 是脚本的主循环。 try
将 cur
设置为 raw_input()
。然后我尝试使用定义的 _Getch
class 来感知向上箭头。这是我遇到麻烦的地方。我无法使用 _Getch
class 感应到向上箭头。我如何使用当前代码感知向上箭头?
raw_input
函数在 ENTER 之前总是读取一个字符串,而不是单个字符(箭头等)
您需要定义自己的 getch
函数,请参阅:Python read a single character from the user。
然后您可以使用 getch` 函数通过循环重新实现 "input" 函数。
下面是一个简单的用法:
while True:
char = getch()
if char == '\x03':
raise SystemExit("Bye.")
elif char in '\x00\xe0':
next_char = getch()
print("special: {!r}+{!r}".format(char, next_char))
else:
print("normal: {!r}".format(char))
在 Windows 下,使用以下键:Hello<up><down><left><right><ctrl+c>
,您将得到:
normal: 'H'
normal: 'e'
normal: 'l'
normal: 'l'
normal: 'o'
special: '\xe0'+'H'
special: '\xe0'+'P'
special: '\xe0'+'K'
special: '\xe0'+'M'
所以箭头对应组合字符:"\xe0H".