Python持续有效地读取stdin

时间:2014-10-25 18:51:28

标签: python-2.x

我试图在Python2.7中设计终端游戏。在我的游戏课中,我有这个:

from board import board
from sys import stdin
from termios import tcgetattr as getat, tcsetattr as setat, TCSADRAIN
from tty import setraw

class game:

    def __init__(self, **kwargs):
        self.board = board() # p1, p2
        self.fd = stdin.fileno()
        self.old_settings = getat(self.fd)
        self.buffer = kwargs.get("key buffer", 4)
        if type(self.buffer) is not int or self.buffer < 4:
            self.buffer = 4


    def wait(self):
        keys = bytearray()
        while True:
            setraw(self.fd)
            keys.insert(0,stdin.read(1))
            setat(self.fd, TCSADRAIN, self.old_settings)
            #'h'=104, 'j'=106, 'k'=107, 'l'=108, 'd'=100, '\x1b'=27, '['=91
            if keys[0] == 104 or keys[0] == 68 and keys[2] == 27 and keys[1] == 91:
                print "left"
            elif keys[0] == 106 or keys[0] == 66 and keys[2] == 27 and keys[1] == 91:
                print "down"
            elif keys[0] == 107 or keys[0] == 65 and keys[2] == 27 and keys[1] == 91:
                print "up"
            elif keys[0] == 108 or keys[0] == 67 and keys[2] == 27 and keys[1] == 91:
                print "right"
            elif keys[0] == 3:
                break
            else:
                print repr(keys[0])

我把它快速地扔在了一起,并不是很多,但这使得stdin&#34; raw&#34;直到它收到一个字符然后将其翻转,这样它就不会弄乱东西(找到here)。唯一的问题是有很多事情并不总是只有一个字符。例如,十进制的向上箭头键是27,91,65或十六进制0x1b,0x5b,0x41或字节&#34; \ x1b \ x5b \ x41&#34;。这是三个不同的字节/字符。如果您查看上面的代码,您可以看到我部分解决了这个问题,但如果我想知道用户是否按了[Home]键,那么需要额外的很多 ,这是4个字节。更难(实际上,如果按下箭头键,这似乎无法解密),用户可能已经点击[Esc](27或0x1b或&#34; \ x1b&#34;)然后[ (91或0x5b或&#34; \ x5b&#34;)然后A(65或0x41或&#34; \ x41&#34;)。对于所有其他箭头键也是如此,大多数功能键也是[Home][Pg Up][Pg Dn][End]等键。 (我已经测试过点击[Esc][A,并且它有效 - 即它将其解释为up)。

几乎所有东西都可以读取箭头键,功能键,home / end / pg键,那么为什么我不能这样做呢?这只是Python(2)中没有开发的东西吗?我真的希望有人可以提供更好的方式或阅读标准或更好的解释方式。

0 个答案:

没有答案