(Python3)Linux和Windows箭头键被按

时间:2017-09-23 17:46:18

标签: python linux windows terminal arrow-keys

我现在正在互联网上寻找一段时间,但我似乎无法找到一种独特的Linux和Windows方式,可以捕捉向上,向下等事件。

使用Windows上的msvcrt包我找到了这个解决方案:

from msvcrt import getch

while True:
    print ('Distance from zero: ' + str(pos))
    key = ord(getch())
    if key == 224: #Special keys (arrows, f keys, ins, del, etc.)
        key = ord(getch())
        if key == 80: #Down arrow

对于Linux,我使用了termios包:

import sys,tty,termios
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

def get():
        inkey = _Getch()
        while(1):
                k=inkey()
                if k!='':break
        if k=='\x1b[A':
                print ("up")

def main():
        for i in range(0,20):
                get()

if __name__=='__main__':
        main()

我还找到了Linux和Windows支持的软件包:keyboard

import keyboard #Using module keyboard
while True:#making a loop
    try: #used try so that if user pressed other than the given key error will not be shown
        if keyboard.is_pressed(keyboard.KEY_DOWN):#if arrow down is pressed 
            print('You Pressed down Key!')

这似乎在Windows上运行良好,但在Linux上运行不正常。

(我在Stack溢出时发现了所有这些实现。)

我的目标是在不同的选择上上下移动我的箭头。也欢迎完成此任务的替代方法。

1 个答案:

答案 0 :(得分:0)

我想你的问题是关于仅在终端命令提示符上捕获箭头键事件。如果是这种情况,那么在Linux中使用getch()用于windows和termios + tty是可行的方法,如你所提到的那样。

备用跨平台方法包括:

  1. 在Linux上,一般建议使用curses模块,您也可以为Windows支持here找到此模块的非官方二进制文件,或者也可以运行:
  2. pip install http://www.lfd.uci.edu/~gohlke/pythonlibs/xugyqnq9/curses-2.2-cp27-none-win32.whl

    1. 问题中提到的键盘模块仅使用sudo权限在linux上工作,如here所述。您也可以尝试PyUserInput,这似乎可以在我的Linux机器上运行。
    2. 一般情况下,您最好在msvcrt / ttty + termios中实现自己的解决方案,或者使用像Pygame或Tkinter这样的GUI库(如果应用程序没有特别要求在终端上运行),这样可以提供捕获功能键盘事件。