箭头键的unicode?

时间:2016-09-20 00:04:55

标签: python python-2.7 unicode python-unicode

我正在尝试创建一个游戏,您可以立即将用户的输入传输到计算机,而不必每次都按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

1 个答案:

答案 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)