[python]python监听、操作键盘鼠标库pynput详细教程

1.【pynput简介】pynput简介,官方是这样介绍自己的:

pynput这个库,允许你控制、监听输入设备。例如监听鼠标、键盘的各种操作。

复制代码
This library allows you to control and monitor input devices.

It contains subpackages for each type of input device supported:

pynput.mouse
Contains classes for controlling and monitoring a mouse or trackpad.
pynput.keyboard
Contains classes for controlling and monitoring the keyboard.

附官方文档:https://pynput.readthedocs.io/en/latest/

后面我们大概流程也将按照以下顺序介绍它的用法。

复制代码
鼠标:"控制鼠标""鼠标按键""监听鼠标",
键盘:"控制键盘""键盘按键""监听键盘"

2.【pynput安装和导入】pynput安装,安装时,会自动安装所依赖的其他库。

复制代码
pip install pynput

导入核心模块:

复制代码
from pynput import mouse, keyboard

3.【鼠标位置】pynput.mouse包里面包含了控制鼠标和监听鼠标的类。可以这样导入:

复制代码
from pynput.mouse import Button, Controller

鼠标的按键在pynput.mouse.Button中,有liftrightmiddle还有unknown四种。

每一个按键都有两个有意义的属性:namevalue。name是该按键的名称,比如 Button.left.name == 'left';

value是记录上一次点击位置的元组。

  • 获取当前鼠标位置:

    from pynput.mouse import Button, Controller

    鼠标控制器

    mouse = Controller()

    获取当前鼠标位置

    print('当前鼠标位置: {}'.format(mouse.position))

打印结果:

复制代码
当前鼠标位置: (303.5851135253906, 71.71687316894531)
  • 设置鼠标移动到某位置(绝对位置):

    from pynput.mouse import Button, Controller

    鼠标控制器

    mouse = Controller()

    设置鼠标都某位置

    mouse.position = (x, y)

示例代码如下:

复制代码
import time
from pynput.mouse import Button, Controller

# 鼠标控制器
mouse = Controller()

# 设置鼠标都某位置
mouse.position = (10, 20)

# 给点反应时间
time.sleep(1)

print('当前鼠标位置: {}'.format(mouse.position))

打印结果:

复制代码
当前鼠标位置: (10.0, 20.0)
  • 设置鼠标移动到某位置(相对当前位置移动)

    from pynput.mouse import Button, Controller

    鼠标控制器

    mouse = Controller()

    鼠标相对当前位置移动:

    mouse.move(250, 250)

示例代码如下:

复制代码
import time
from pynput.mouse import Button, Controller

# 鼠标控制器
mouse = Controller()


# 设置鼠标都某位置
mouse.position = (10, 20)

# 留点反应时间再打印
time.sleep(1)
print('当前鼠标位置: {}'.format(mouse.position))


# 鼠标相对当前位置移动:
mouse.move(250, 250)

# 留点反应时间再打印
time.sleep(1)
print('当前鼠标位置: {}'.format(mouse.position))

4.【鼠标点击和滚轮滚动】

鼠标点击:可以直接用click(),也可以拆解按下press和释放release。

鼠标滚轮滚动用:mouse.scroll(x, y)

复制代码
import time
from pynput.mouse import Button, Controller

# 鼠标控制器
mouse = Controller()

# 右击; 
mouse.click(Button.right, 1)
#说明:可以控制点击次数,这里1次。

# 按下和释放右键 === 等价于:右击
mouse.press(Button.right)
mouse.release(Button.right)

# 双击左键
mouse.click(Button.left, 2)
#说明:可以控制点击次数,双击这里传入2次。

# 滚动鼠标滚轮
mouse.scroll(x, y)
说明:Mac电脑,y>0,向上滚动内容。y<0,向下滚动内容

完整示例如下:

复制代码
import time
from pynput.mouse import Button, Controller

# 鼠标控制器
mouse = Controller()

# 移动到某个位置 (700, 300)为例
mouse.position = (700, 300)

# 留点缓冲时间
time.sleep(0.1)

# 向下滚动30单位
mouse.scroll(0, -30)

# 按下和释放右键
mouse.press(Button.right)
mouse.release(Button.right)

4.【鼠标监听,方式1】根据这种监听方式特点,方便区分,我给它命名为:listener监听方式。

鼠标监听包括,鼠标移动、点击、滚轮滚动监听。

完整示例代码如下

复制代码
from pynput import mouse

# 移动监听
def on_move(x, y):
    print('鼠标移动到了:{}'.format((x, y)))

# 点击监听
def on_click(x, y, button, pressed):
    print('鼠标按键:{},在位置处 {}, {} '.format(button, (x, y), '按下了' if pressed else '释放了'))

# 滚动监听
def on_scroll(x, y, dx, dy):
    print('滚动中... {} 至 {}'.format('向下:' if dy < 0 else '向上:', (x, y)))


# 构造监听器对象,方式1: (监听哪几种类型事件)
with mouse.Listener(
        on_move=on_move,
        on_click=on_click,
        on_scroll=on_scroll) as listener:




# 构造监听器对象,方式2(可替换上面with)(监听哪几种类型事件)
listener = mouse.Listener(
    on_move=on_move,
    on_click=on_click,
    on_scroll=on_scroll)

# 开始监听
listener.start()

滚动、右击监听效果

复制代码
说明:
1.构造监听器对象,有2种方式。任何一种方式均可。

# 构造监听器对象,方式1: (监听哪几种类型事件)
with mouse.Listener(
        on_move=on_move,
        on_click=on_click,
        on_scroll=on_scroll) as listener:
    listener.join()



# 构造监听器对象,方式2(可替换上面with)(监听哪几种类型事件)
listener = mouse.Listener(
    on_move=on_move,
    on_click=on_click,
    on_scroll=on_scroll)


2.有了监听器对象,就开始监听,按是否阻断分为2种方式:
# 监听启动方式1:阻断式
listener.join()

# 监听启动方式2:非阻断式
listener.start()

3.停止监听:
任何位置调用pynput.mouse.Listener.stop 或者在上面3个回调方法中,只要有return False即可停止监听。

6.【停止鼠标监听】

任何位置调用pynput.mouse.Listener.stop 或者在回调方法中return False来停止监听。

官方文档原文是:

复制代码
Call pynput.mouse.Listener.stop from anywhere, 
raise StopException or return False from a callback to stop the listener.

例如,我若想在点击监听回调里,释放时,停止监听。则可以这样写:

复制代码
def on_click(x, y, button, pressed):
 print('鼠标按键:{},在位置处 {}, {} '.format(button, (x, y), '按下了' if pressed else '释放了'))
 if not pressed:
      # 停止监听
      return False

7.【鼠标监听,方式2】根据这种监听方式特点,方便区分,我给它命名为:event监听方式。这种方式更简洁。

注意写法区别上面的方式1的listener监听。

复制代码
from pynput import mouse


with mouse.Events() as events:
    for event in events:
        if hasattr(event, 'button'):
            deal = '按下了:' if event.pressed else '释放了:'
            if event.button == mouse.Button.left:
                print('{}mouse.Button.left'.format(deal))

            elif event.button == mouse.Button.right:
                print('{} mouse.Button.right'.format(deal))

            elif event.button == mouse.Button.middle:

                print('{} mouse.Button.middle'.format(deal))

            elif event.button == mouse.Button.unknown:
                print('{} mouse.Button.unknown'.format(deal))
        else:
            print('鼠标箭头:滑动中...')

打印结果:

复制代码
鼠标箭头:滑动中...
鼠标箭头:滑动中...
鼠标箭头:滑动中...
鼠标箭头:滑动中...
鼠标箭头:滑动中...
按下了:mouse.Button.left
释放了:mouse.Button.left
鼠标箭头:滑动中...
鼠标箭头:滑动中...
按下了: mouse.Button.right
释放了: mouse.Button.right
复制代码
说明:
1.按下、释放都会被监听到。如果需要监听是按下还是释放,可以通过event对象的event.pressed来区分。
2.鼠标滑动时,event对象没有button属性。可以添加条件:if hasattr(event, 'button'):
有button属性则是点击了鼠标按钮。否则是鼠标箭头滑动。

8.【键盘键入】导入核心类

复制代码
from pynput.keyboard import Key, Controller
  • 按下和释放键盘

    from pynput.keyboard import Key, Controller

    键盘控制器

    keyboard = Controller()

    按下和释放键盘,Key.space表示空格键

    keyboard.press(Key.space)
    keyboard.release(Key.space)

  • 键盘快速输入

    from pynput.keyboard import Key, Controller

    键盘控制器

    keyboard = Controller()

    输入,例如输入Hello World

    keyboard.type('Hello World')

9.【键盘键入监听,方式1】根据此方式监听特点,且为了方便区分,我给它命名为listener方式。

复制代码
from pynput import keyboard


def on_press(key):
    try:
        print('字母键: {} 被按下'.format(key.char))
    except AttributeError:
        print('特殊键: {} 被按下'.format(key))


def on_release(key):
    print('{} 释放了'.format(key))
    if key == keyboard.Key.esc:
        # 释放了esc 键,停止监听
        return False


# 方式1:构造监听器对象listener
with keyboard.Listener(
        on_press=on_press,
        on_release=on_release) as listener:


# 方式2:构造监听器对象listener
listener = keyboard.Listener(
    on_press=on_press,
    on_release=on_release)

# 开始监听
# 监听启动方式1:阻断式
listener.join()

# 监听启动方式2:非阻断式
listener.start()
复制代码
说明:
1.构造监听器对象listener,有2种方式。任何一种方式均可。

# 方式1:构造监听器对象listener
with keyboard.Listener(
        on_press=on_press,
        on_release=on_release) as listener:


# 方式2:构造监听器对象listener
listener = keyboard.Listener(
    on_press=on_press,
    on_release=on_release)


2.有了监听器对象,就开始监听,按是否阻断分为2种方式:
# 监听启动方式1:阻断式
listener.join()

# 监听启动方式2:非阻断式
listener.start()

3.停止监听:
任何位置调用pynput.keyboard.Listener.stop 或者在上面3个回调方法中,只要有return False即可停止监听。

10.【键盘键入监听,方式2】根据此方式监听特点,给它命名为event方式。

复制代码
from pynput import keyboard


# 监听键盘键入
with keyboard.Events() as events:
    for event in events:

        # 监听esc键,释放esc键,停止监听。
        if event.key == keyboard.Key.esc:
            print('接收到事件 {}, 停止监听'.format(event))
            break
        else:
            if isinstance(event, keyboard.Events.Press):
                print('按下按键 {} '.format(event))
            elif isinstance(event, keyboard.Events.Release):
                print('松开按键 {}'.format(event))


----------

说明:
1.判断是按下键盘还是释放键盘,通过:
if isinstance(event, keyboard.Events.Press):
   print('按下按键 {} '.format(event))
elif isinstance(event, keyboard.Events.Release):
   print('松开按键 {}'.format(event))

2.判断是哪个键,通过event.key,
pynput.keyboard.Key类中定义了键盘中的所有键。

3.上面,监听esc键,释放esc键,停止监听。

打印结果:

复制代码
按下按键 Press(key=Key.cmd_r) 
按下按键 Press(key=Key.space) 
松开按键 Release(key=Key.cmd_r)
松开按键 Release(key=Key.space)
按下按键 Press(key='h') 
松开按键 Release(key='h')
按下按键 Press(key='e') 
松开按键 Release(key='e')
按下按键 Press(key='l') 
松开按键 Release(key='l')
按下按键 Press(key='l') 
松开按键 Release(key='l')
按下按键 Press(key='o') 
松开按键 Release(key='o')
按下按键 Press(key=Key.space) 
松开按键 Release(key=Key.space)
按下按键 Press(key='w') 
松开按键 Release(key='w')
按下按键 Press(key='o') 
松开按键 Release(key='o')
按下按键 Press(key='r') 
松开按键 Release(key='r')
按下按键 Press(key='l') 
松开按键 Release(key='l')
按下按键 Press(key='d') 
松开按键 Release(key='d')

hello world

11.【同时监听鼠标、键盘】使用pynput包同时监听键盘消息和鼠标消息。上面键盘和鼠标的listener方式和event方式,都可用选择是阻断式还是非阻断式监听。

复制代码
# 监听启动方式1:阻断式
listener.join()

# 监听启动方式2:非阻断式
listener.start()

程序调用监听器的join()方法后,即被阻塞,不再执行后面的语句,以这种方式启动监听器,只能监听在某个监听器的join()方法调用前已启动的监听器的消息。

因此,除了最后一个监听器外,其他监听器不能用listener.join()的方式启动,只能用非阻塞的listener.start()的方式启动。最后一个监听器则应当以listener.join()的方式启动,以使程序执行被阻塞,防止程序直接结束。

相关推荐
永霖光电_UVLED9 小时前
KAIST 团队研发出高效、超高分辨率的红色微米发光二极管(Micro-LED)显示器
计算机外设
春日见1 天前
车辆动力学:前后轮车轴
java·开发语言·驱动开发·docker·计算机外设
PHOSKEY2 天前
光子精密QM系列闪测仪在鼠标电路板部件质量控制中的核心应用
计算机外设
墩墩冰2 天前
计算机图形学 分析选择缓冲区中的数字
计算机外设
UI设计兰亭妙微2 天前
中车株州所显示器界面设计
计算机外设·界面设计
墩墩冰2 天前
计算机图形学 多视区的显示
计算机外设
墩墩冰2 天前
计算机图形学 GLU库中的二次曲面函数
计算机外设
墩墩冰2 天前
计算机图形学 利用鼠标实现橡皮筋技术
计算机外设
企鹅侠客4 天前
鼠标键盘按键统计工具
计算机外设·键盘·鼠标
华一精品Adreamer5 天前
便携式显示器供应链与成本结构:挑战与机遇
计算机外设