Python: Windows 系统中监测键盘输入的两种方法

本文介绍 Python 程序在 Windows 系统中监测键盘输入的两种方法:keyboard 和 pynput 工具包。


keyboard


keyboard 是一个第三方库,pip install 即可安装使用,官网链接如下:
keyboard, PyPI

本文以空格键暂停程序运行以获取键盘输入为例,展示 keyboard 的调用方法。

具体有两种方式实现。一种是 keyboard.hook 方法,相当于在进程中埋了一个“钩子”,在按下对应按键时触发一个函数,具体代码如下:

from datetime import datetime
import time

import keyboard

print()
dts = datetime.now()
flag = False


def abc(x):
    global flag
    a = keyboard.KeyboardEvent(event_type='down', scan_code=57, name='space')

    # # get key code and name
    # print("current key code:  {}".format(x.scan_code))
    # print("current key name:  {}".format(x.name))

    if x.event_type == a.event_type and x.scan_code == a.scan_code:
        print("You pressed {}.".format(a.name))
        flag = True


keyboard.hook(abc)
num_iter = 20

for i in range(num_iter):
    print(i)
    time.sleep(0.2) 
    if flag:
        print("Paused, please input something:")
        ipt = input()
        print("You input {}".format(ipt))
        flag = False

dte = datetime.now()
tm = round((dte - dts).seconds + (dte - dts).microseconds / (10 ** 6), 3)
print("total running time:  {} s".format(tm), '\n')

其中,keyboard.KeyboardEvent 中的 scan_code 和 name 参数即为按键的名称和代码,如果事先未知,可以在 abc 函数中 print 出来,参见注释掉的部分。这里列出几个常用按键的代码和名称:

name scan code
space 57
enter 28
ctrl 29
shift 42
right shift 54
alt 56
right alt 56
backspace 14
tab 15
caps lock 58
left windows 91
esc 1
up 72
down 80
left 75
right 77
` 41
/ 53
\ 43
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
0 11

上述代码的运行效果如下:
Python: Windows 系统中监测键盘输入的两种方法_第1张图片

另一种方法是通过 keyboard.on_press 实现,代码如下:

import time

import keyboard


flag = False


def key_press(key):
    global flag
    if key.name == 'space':
        flag = True


keyboard.on_press(key_press)

num_iter = 20
for i in range(num_iter):
    print(i)
    time.sleep(0.2)
    if flag:
        print("Paused, please input something:")
        ipt = input()
        print("You input {}".format(ipt))
        flag = False

pynput


与 keyboard 相似,pynput 也是一个第三方库,pip install 即可安装使用,官网链接如下:
pynput, PyPI

除键盘监测外,pynput 还可以监测鼠标,本文暂不讨论该功能。

同样是以空格键暂停程序运行以获取键盘输入的场景,调用 pynput 时通过 pynput.keyboard.Listener 实现,具体代码如下:

import time

from pynput import keyboard


flag = False


def on_press(key):
    global flag

    if not flag:
        print("key {} is pressed".format(key))

    if key == keyboard.Key.space:
        flag = True


def on_release(key):
    pass


# ...or, in a non-blocking fashion:
listener = keyboard.Listener(
    on_press=on_press,
    on_release=on_release)
listener.start()

num_iter = 20
for i in range(num_iter):
    print(i)
    time.sleep(0.1)
    if flag:
        print("Paused, please input something:")
        ipt = input()
        print("You input {}".format(ipt))
        flag = False

局限性


如题所述,本文所介绍的两种方法都适用于 Windows 系统环境,但在远程控制 Linux 服务器时,这两种方法都会遇到问题,笔者暂未能解决,只好通过额外开启一个线程放置 input 函数来实现。

具体地,对于 pynput 工具包,官网给出了 platform limitation 的解释:
pynput, platform limitations

Python: Windows 系统中监测键盘输入的两种方法_第2张图片

你可能感兴趣的:(Python,机器学习,深度学习,概率论)