python的pynput模块控制鼠标、键盘和监听鼠标、键盘事件

前言

本来在做图形界面时想用监听键盘的方式来实现,快捷键功能的。运用多线程一个线程是运行图形界面,另一个线程监听键盘的动作。可使用的时候发现不太协调,两个进程虽然都能运行但是图形界面会有时卡住,看了文档才知道这种方法行不通。后来查文档看到了wxpython有热键方法,我去顿时心中尼玛。。。。我这不是闲的吗?不过这个监听的方法还是做个笔记,记下来吧。

行不通原因:

文档内容:On Windows, virtual events sent by other processes may not
be received. This library takes precautions, however, to dispatch any
virtual events generated to all currently running listeners of the
current process.
译文:在Windows上,可能无法接收其他进程发送的虚拟事件。但是,此库会采取预防措施,将生成的任何虚拟事件分派给当前进程的所有当前正在运行的侦听器。

pynput库简介

This library allows you to control and monitor input devices.
这是来自官方文档的介绍,就这一句。意思是此库允许您控制和监视输入设备。这也就是说这个库可以控制和监听输入设备。
文档地址pynput文档地址

pynput使用示例

控制鼠标

from pynput.mouse import Button, Controller  # 导入pynput库的Button和Controller模块

mouse = Controller()  # 创建控制器对象

# position属性返回一个元组(指针位置)
print('The current pointer position is {0}'.format(mouse.position))

# 设置指针位置
mouse.position = (500, 500)
print('当前鼠标的位置 {0}'.format(mouse.position))

# 将鼠标指针从其当前位置移动 两个参数dx(水平偏移量)和dy(垂直偏移量)
mouse.move(100, -100)
print('移动后的鼠标位置{0}'.format(mouse.position))

# 按下左键并释放左键
mouse.press(Button.left)  # 按下左键 (参数为Button)
mouse.release(Button.left)  # 释放左键 (参数为Button)

# 双击左键
mouse.click(Button.left, 2)  # 两个参数第一个参数为Button(鼠标的按键)第二个参数为int类型(点击的次数)

# 向下滚动两步
mouse.scroll(0, 2)  # 鼠标滚轮事件 两个参数dx(水平滚动)和dy(垂直滚动)单位不确定(根据我的感觉应该是鼠标的滚轮滚动一下(一个刻度))

监控鼠标

from pynput.mouse import Listener,Button
"""监听鼠标事件"""


# 监听鼠标移动事件,将鼠标的位置打印出来
# on_move(x,y)是鼠标移动时回调的函数两个参数x,y描述的是鼠标的位置
def on_move(x, y):
    print('鼠标指针移动到的位置 {0}'.format((x, y)))

# 监听鼠标按键
# on_click(x, y, button, pressed)是鼠标点击时回调的函数
# 四个参数x,y,button,pressed。
# x,y描述的是鼠标点击的位置
# button是鼠标的按键,值有三种Button.left(左键)、Button.right(右键)、Button.middle(中键)
# 注意鼠标button使用按下一次会有两次反馈(按下和松开)。想要使用一次可以把一个if pressed:语句放在它的外层
# pressed的值是bool类型是鼠标按键的按下时是True,松开时为False。
def on_click(x, y, button, pressed):
    if button == Button.left:
        print('{0}位置{1}'.format('鼠标左键按下'if pressed else '鼠标左键松开',(x, y)))
    elif button == Button.right:
        print('{0}位置{1}'.format('鼠标右键按下'if pressed else '鼠标右键松开',(x, y)))
    elif button == Button.middle:  # 停止监听
        return False
    
# 滑轮滚动事件
# x,y指针位置
# dx,dy滚轮的动作方向
def on_scroll(x, y, dx, dy):
    print('Scrolled {0}'.format((x, y)))
    print(dx, dy)

# Collect events until released
with Listener(on_move=on_move, on_click=on_click, on_scroll=on_scroll) as listener:
    listener.join()
    

控制键盘

from pynput.keyboard import Key, Controller

keyboard = Controller()

# 等于按压和释放空格
keyboard.press(Key.space)
keyboard.release(Key.space)


# 等于按压键盘的a键
keyboard.press('a')
keyboard.release('a')

# 等于按压键盘的大写A键
keyboard.press('A')
keyboard.release('A')

# 键入Hello World
keyboard.type('Hello World')

# 在按下shift的同时按下a(可以用来设置组合键如ctrl+c复制快捷键)
with keyboard.pressed(Key.shift):
    keyboard.press('a')
    keyboard.release('a')

监控键盘

from pynput.keyboard import Key, Listener


# 按下键盘时回调的函数
def on_press(key):
    print('{0} 按下'.format(key))


# 释放键盘时回调的函数
def on_release(key):
    print('{0} 松开'.format(key))
    if key == Key.esc:
        # 停止监听
        return False


# 监听
with Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()

补充

监听器继承于threading.Thread可以进行一些线程的操作文档链接

你可能感兴趣的:(python,python)