from evdev import InputDevice key_dev = InputDevice("/dev/input/event4")
# waiting for IO event dev_list, _, _ = select([key_dev], [], [], 0.2) for dev in dev_list: if dev is key_dev: events = dev.read() print("-"*20) # get keyboard input event for env in events: if env.code in key_map and env.type == 0x01: print("-"*9, key_map[env.code], "-"*10) return key_map[env.code] return ""
evdev包 需要安装
pip install evdev
其中event4是linux中键盘对应的keyboard input设备(linux一切皆为文件),不同的电脑对应额event是不一样的。
可以通过下诉命令查看对应设备
cat /proc/bus/input/devices
输出
I: Bus=0019 Vendor=0000 Product=0005 Version=0000 N: Name="Lid Switch" P: Phys=PNP0C0D/button/input0 S: Sysfs=/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0D:00/input/input0 U: Uniq= H: Handlers=event0 B: PROP=0 B: EV=21 B: SW=1 I: Bus=0019 Vendor=0000 Product=0001 Version=0000 N: Name="Power Button" P: Phys=PNP0C0C/button/input0 S: Sysfs=/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input1 U: Uniq= H: Handlers=kbd event1 B: PROP=0 B: EV=3 B: KEY=10000000000000 0 I: Bus=0019 Vendor=0000 Product=0003 Version=0000 N: Name="Sleep Button" P: Phys=PNP0C0E/button/input0 S: Sysfs=/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0E:00/input/input2 U: Uniq= H: Handlers=kbd event2 B: PROP=0 B: EV=3 B: KEY=4000 0 0
通过name字样可以找到对应的keyboard设备的event名称
监听到的事件中,code对应键盘的按键值,type对应事件类型(0x01为按键按下事件)
//20201219 上述方法只能监听本机keyboard事件(ssh 的设备的键盘无法对该程序进行控制)
可以采用监听stdin来完成同样的功能,代码如下
import sys, select, termios, tty def getKey(): tty.setraw(sys.stdin.fileno()) select.select([sys.stdin], [], [], 1) key = sys.stdin.read(1) termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings) return key if __name__ == "__main__": settings = termios.tcgetattr(sys.stdin) while True: print("get key: {}".format(getKey()))
其中关于tty的设置可参考官方文档:https://docs.python.org/zh-cn/3.7/library/termios.html, https://docs.python.org/zh-cn/3.7/library/tty.html
Powered by Froala Editor
发表评论 (对文章评论)