当前位置: 首页 > news >正文

[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 mousewith 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 keyboarddef 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))breakelse: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()的方式启动,以使程序执行被阻塞,防止程序直接结束。

相关文章:

  • 后端设计PNR一点总结
  • Qt不规则可移动窗体的实现
  • Linux的RPM 与 YUM
  • WebService学习,wsdl文件详解
  • 华清远见嵌入式学习——驱动开发——day9
  • C语言-指针初学速成
  • 【python】linux系统python报错“ssl module in Python is not available”
  • HCIA(11)OSPF 数据包构成(Hello、DBD、LSR、LSU、LSAck包)、状态机、工作流程(建立邻居关系、主从关系协商、LSDB同步)
  • 服务端实时推送技术之SSE(Server-Send Events)
  • 相机图像质量研究(39)常见问题总结:编解码对成像的影响--运动模糊
  • 【java中的方法如何定义与使用】
  • Spring Cloud Alibaba-04-Sentinel服务容错
  • element导航菜单el-menu添加搜索功能
  • PyTorch使用Tricks:学习率衰减 !!
  • Leetcode 209.长度最小的子数组
  • 【Leetcode】101. 对称二叉树
  • @angular/forms 源码解析之双向绑定
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • avalon2.2的VM生成过程
  • bootstrap创建登录注册页面
  • Create React App 使用
  • ES6语法详解(一)
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Lsb图片隐写
  • PHP 的 SAPI 是个什么东西
  • springboot_database项目介绍
  • Vue2.x学习三:事件处理生命周期钩子
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 程序员该如何有效的找工作?
  • 从tcpdump抓包看TCP/IP协议
  • 简单实现一个textarea自适应高度
  • 小程序开发中的那些坑
  • 用 Swift 编写面向协议的视图
  • 追踪解析 FutureTask 源码
  • ​520就是要宠粉,你的心头书我买单
  • ​configparser --- 配置文件解析器​
  • ​插件化DPI在商用WIFI中的价值
  • (1)SpringCloud 整合Python
  • (BFS)hdoj2377-Bus Pass
  • (python)数据结构---字典
  • (vue)页面文件上传获取:action地址
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (转)创业的注意事项
  • .NET Core 通过 Ef Core 操作 Mysql
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .Net的DataSet直接与SQL2005交互
  • .NET框架
  • .NET企业级应用架构设计系列之结尾篇
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .NET委托:一个关于C#的睡前故事
  • .Net下的签名与混淆
  • @拔赤:Web前端开发十日谈
  • [2021ICPC济南 L] Strange Series (Bell 数 多项式exp)