• Shell和Python获取键盘事件


    Shell和Python可以说是Linux环境中很常用的脚本语言了,可以方便地实现运维、测试等等自动化,减轻人的负担。
    很多时候,脚本也需要和用户进行简单的交互,例如读取键盘输入。响应键盘事件和读取输入还是不同的。响应键盘事件指的是判断哪个按键被按下,用户按下某一按键后立即响应,例如按下q键立即退出程序。而读取输入则一般是用户输入一行后,按下回车,则程序读入这一行字符串。
    读取输入比较常用,在Shell中可以使用read,在Python中可以使用input()或者sys.stdin.readline()等。
    如果需要实现对用户按下键盘按键的响应,可以通过以下方式实现。

    Shell

    Shell中可以用read实现按键检测(解释器使用bash)。
    read -rsN1 input
    上述代码的含义是获取键盘按键,并存放到input中。其中read的参数含义如下:

    • -r:禁用转义字符。
    • -s:安静模式,不将输入显示出来。例如按下按键A后,字母A不会显示在命令行里。
    • -N1:严格读取一个字符后结束,换行符也算一个字符。

    这样就可以获取键盘按下的按键信息了。例如,用户按下W、S、A、D四个按键后,显示前(Forward)后(Backward)左(Left)右(Right),按下Q键退出,代码如下:

    while true; do
        read -rsN1 input
        if [[ "$input" == "w" ]]; then
            echo "Forward"
        elif [[ "$input" == "s" ]]; then
            echo "Backward"
        elif [[ "$input" == "a" ]]; then
            echo "Left"
        elif [[ "$input" == "d" ]]; then
            echo "Right"
        elif [[ "$input" == "q" ]]; then
            echo "Quit!"
            break
        else
            continue
        fi
    done
    

    上面的代码也可以获取按下回车键的事件。不过如果要判断按下的按键是回车键,不能直接用if [[ "$input" == " " ]]; then这样判断,而是要利用echo -e进行转义:

    if [[ "$input" == `echo -e "
    "` ]]; then
            echo "You pressed enter!"
    fi
    

    Python

    在Python中获取键盘事件,可以使用keyboard模块。
    pip install keyboard或者pip3 install keyboard安装该模块。同样实现前面例子的功能,代码如下:

    import keyboard
    
    while True:
        if keyboard.is_pressed('w'):
            print('Forward')
        elif keyboard.is_pressed('s'):
            print('Backward')
        elif keyboard.is_pressed('a'):
            print('Left')
        elif keyboard.is_pressed('d'):
            print('Right')
        elif keyboard.is_pressed('enter'):  # if key 'enter' is pressed 
            print('You pressed enter!')
        elif keyboard.is_pressed('q'):
            print('Quit!')
            break
    

    不过shell和python对于是否显示输入的处理不太一样。使用shell脚本时,键盘按下的按键内容是不会显示的(因为使用了-s选项)。而使用python时,程序执行过程中会在输出中显示你按下的按键。而且如果是在命令行中运行这个脚本,脚本退出后,你按下的按键又会在命令行里显示,并且被命令行读取一遍,甚至执行(如果按下一些按键之后按下了回车),感觉不太优雅。例如,如果在python脚本执行过程中,你恰好依次按下了D、A、T、E键(小写)和回车,那么程序退出后,命令行真的会读取date和回车,然后执行date,打印出日期和时间。

  • 相关阅读:
    Insert into a Binary Search Tree
    Search in a Binary Search Tree
    Binary Search Tree Iterator
    Validate Binary Search Tree
    Serialize and Deserialize Binary Tree
    图的搜索
    codeforce vk cup2017
    hdu1160dp
    完全背包hdu1114
    最长递增子序列hdu1087
  • 原文地址:https://www.cnblogs.com/xia-weiwen/p/13512463.html
Copyright © 2020-2023  润新知