我正在尝试创建一个游戏,您可以立即将用户的输入传输到计算机,而不必每次都按enter
。我知道怎么做,但我似乎找不到箭头键的unicode号码。是否有unicode,或者我只是被困在wasd?
class _GetchUnix:
def __init__(self):
import tty, sys
def __call__(self):
import sys, tty, termios
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
class _GetchWindows:
def __init__(self):
import msvcrt
def __call__(self):
import msvcrt
return msvcrt.getch()
class _Getch:
def __init__(self):
try:
self.impl = _GetchWindows()
except ImportError:
self.impl = _GetchUnix()
def __call__(self): return self.impl()
getch = Getch()
我使用getch.impl()
作为试错法输入,因为如果在调用函数时按下某个键,它将返回该键,然后继续。如果没有按下按键,它就会继续前进
我使用的是Python 2.7.10
答案 0 :(得分:1)
首先阅读msvcrt的相关文档。
msvcrt.kbhit()
如果按键等待读取,则返回true。
msvcrt.getch()
读取按键并将结果字符作为字节字符串返回。控制台没有任何回应。如果按键尚未可用,此调用将阻止,但不会等待按下Enter键。如果按下的键是特殊功能键,则返回'\ 000'或'\ xe0';下一个调用将返回键码。使用此功能无法读取Control-C按键。
请注意,getch会阻塞并需要两次调用特殊功能键,其中包括箭头键(它们最初会返回b'\xe0
)。
然后使用sys.platform并编写两个版本的get_arrow函数。
import sys
if sys.platform == 'win32':
import msvcrt as ms
d = {b'H': 'up', b'K': 'lt', b'P': 'dn', b'M': 'rt'}
def get_arrow():
if ms.kbhit() and ms.getch() == b'\xe0':
return d.get(ms.getch(), None)
else:
return None
else: # unix
...
我通过以下代码实验确定了密钥到代码的映射。 (这在IDLE中运行时不起作用,也可能在其他GUI框架中不起作用,因为getch与键盘的GUI处理冲突。)
>>> import msvcrt as ms
>>> for i in range(8): print(ms.getch())
...
b'\xe0'
b'H'
b'\xe0'
b'K'
b'\xe0'
b'P'
b'\xe0'
b'M'
我在Windows上使用
测试了该功能while True:
dir = get_arrow()
if dir: print(dir)