赞
踩
pynput包可以监听键盘消息和鼠标消息,但是你很难找到既监听鼠标消息又监听键盘消息例子。其主要原因就是大部分示例中监听鼠标和键盘消息时都采用了阻塞式的监听方式,即
listener.join()
程序调用监听器的join()方法后,即被阻塞,不再执行后面的语句,以这种方式启动监听器,只能监听在某个监听器的join()方法调用前已启动的监听器的消息。因此,除了最后一个监听器外,其他监听器不能用listener.join()的方式启动,只能用非阻塞的listener.start()的方式启动。最后一个监听器则应当以listener.join()的方式启动,以使程序执行被阻塞,防止程序直接结束。示例代码如下:
- import pynput
- import sys
-
- '''
- 本程序演示使用pynput库同时监控键盘事件和鼠标事件。要同时监控键盘事件和鼠标事件,
- 必须用非阻塞方式启动键盘监听线程和鼠标监听线程,也就是说除了最后一个监听器外,不
- 能用listener.join()的方式启动,只能用listener.start()的方式启动。最后一个监听器
- 则应当以listener.join()的方式启动,以使程序执行被阻塞,防止程序直接结束
- '''
- start_x = 0
- start_y = 0
- #鼠标事件处理函数。鼠标左键抬起时输出鼠标左键按下和抬起时的位置
- def on_click(x, y, button, pressed):
- global start_x, start_y
- if pressed and button == pynput.mouse.Button.left:
- (start_x, start_y) = (x, y)
- elif (not pressed) and (button == pynput.mouse.Button.left):
- print(f'\n鼠标左键按下并抬起一次。\n按下时的位置:start_x={start_x}, ',
- f'start_y={start_y}\n抬起时的位置end_x={x}3, end_y={y}')
-
- #键盘事件处理函数。输出被按下的键,按下'e'键结束程序
- def on_press(key):
- print(f'按键{key}被按下\n')
- if (key == pynput.keyboard.KeyCode(char = 'e')):
- sys.exit()
-
- #以非阻塞的方式启动鼠标监控
- mouse_listener = pynput.mouse.Listener(on_click=on_click)
- mouse_listener.start()
-
- #最后一个监听器以阻塞方式启动
- with pynput.keyboard.Listener(on_press=on_press) as keybord_listener:
- keybord_listener.join()
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。