【教程&整活】python第三方库pynput全局键盘监听+demo“ikun键盘”
本篇文章主要讲pynput的键盘监听,以及一个demo“ikun键盘程序”
1. 全局键盘监听
1.1 pynput.keyboard.Listener
这是pynput的子模块keyboard中的一个类,keyboard子模块都是关于键盘操作和监听的
Listener类有两个重要的构造参数,也是我们使用最多的:
Listener(on_press=按下按键时触发的函数,on_release=松开按键时触发的函数)
一般在程序中我们这么使用:
with keyboard.Listener(on_press=按下按键触发的函数,on_release=松开按键触发的函数) as listener: listener.join()
按下或者松开按键所触发的函数还有一个参数用来接收按键信息,我一般用key作为参数名
listener.join()是线程阻塞函数,它会让这块代码所在的函数始终监听键盘,所以如果有其他需要阻塞线程或者使用主循环的函数(比如rkinter的mainloop()函数)应该使用多线程
举个例子:
from pynput import keyboard#首先导入模块 def key_press(key):#定义按键按下时触发的函数 print("按键被按下了") def key_release(key): print("按键被松开了") with keyboard.Listener(on_press=key_press,on_release=key_release) as listener: listener.join()
1.2 获取被按下或者被松开的按键
此时被的触发函数接收的参数key派上了用途。如果是普通按键(就是字母或数字之类),key会有一个叫做char的属性,char本身是一个python字符串,我们可以判断字符串从而得知按下或者松开了哪个键。
举个例子:
from pynput import keyboard#首先导入模块 def key_press(key):#定义按键按下时触发的函数 print(f"按键{key.char}被按下了") def key_release(key): print(f"按键{key.char}被松开了") with keyboard.Listener(on_press=key_press,on_release=key_release) as listener: listener.join()
但是还有特殊按键的存在呢!比如说ctrl、alt、shift等,如果按下或松开这种特殊按键,传入的key可就不一样了,它没有char属性,所以会报错AttributeError: 'Key' object has no attribute 'char'
于是我们可以用try…except语句,如果程序没遇到AttributeErro,就按普通按键处理,如果遇到了,就是特殊按键,而特殊按键可以在keyboard模块的Key中找到它们的“尊姓大名”,比如keyboard.Key.esc
下面请看例子:
from pynput import keyboard#首先导入模块 def key_press(key):#定义按键按下时触发的函数 try: print(f"按键{key.char}被按下了") except AttributeError: pass def key_release(key): try: print(f"按键{key.char}被松开了") except AttributeError: pass with keyboard.Listener(on_press=key_press,on_release=key_release) as listener: listener.join()
这样按下特殊按键不会报错了
1.3 组合键监听--特殊转义字符
pynput可以监听很多组合键,并且给触发的函数传入转义字符,例如是表示ctrl+0
注意,使用组合键监听需要keyboard模块的另外一员大将-- Controller。下面看例子:
from pynput.keyboard import Key, Controller,Listener keyboard = Controller() def on_press(key): print('{0} 被按下'.format(key)) def on_release(key): print('{0} 被释放'.format(key)) if key == Key.esc: return False if str(key) == r"":# ctrl 0 print('按下ctrl 0,运行测试程序') # 创建监听 with Listener(on_press=on_press,on_release=on_release) as listener: listener.join()
组合键键值表如下(摘自Python中的pynput中组合键的键值_一个小坑货的博客-CSDN博客_pynput 组合键):
keyboard_key_dict = { r"'\x01'" : ['ctrl','a'], r"'\x02'" : ['ctrl','b'], r"'\x03'" : ['ctrl','c'], r"'\x04'" : ['ctrl','d'], r"'\x05'" : ['ctrl','e'], r"'\x06'" : ['ctrl','f'], r"'\x07'" : ['ctrl','g'], r"'\x08'" : ['ctrl','h'], r"'\t'" : ['ctrl','i'], r"'\n'" : ['ctrl','j'], r"'\x0b'" : ['ctrl','k'], r"'\x0c'" : ['ctrl','l'], r"'\r'" : ['ctrl','m'], r"'\x0e'" : ['ctrl','n'], r"'\x0f'" : ['ctrl','o'], r"'\x10'" : ['ctrl','p'], r"'\x11'" : ['ctrl','q'], r"'\x12'" : ['ctrl','r'], r"'\x13'" : ['ctrl','s'], r"'\x14'" : ['ctrl','t'], r"'\x15'" : ['ctrl','u'], r"'\x16'" : ['ctrl','v'], r"'\x17'" : ['ctrl','w'], r"'\x18'" : ['ctrl','x'], r"'\x19'" : ['ctrl','y'], r"'\x1a'" : ['ctrl','z'], r"'\x1f'" : ['ctrl','shift','-'], r"" : ['ctrl',';'], r"" : ['ctrl','='], r"" : ['ctrl','-'], r"" : ['ctrl','`'], r"" : ['ctrl',r"'"], r"" : ['ctrl','0'], r"" : ['ctrl','1'], r"" : ['ctrl','2'], r"" : ['ctrl','3'], r"" : ['ctrl','4'], r"" : ['ctrl','5'], r"" : ['ctrl','6'], r"" : ['ctrl','7'], r"" : ['ctrl','8'], r"" : ['ctrl','9'], r"'~'" : ['shift', '`'], r"'!'" : ['shift', '1'], r"'@'" : ['shift', '2'], r"'#'" : ['shift', '3'], r"'$'" : ['shift', '4'], r"'%'" : ['shift', '5'], r"'^'" : ['shift', '6'], r"'*'" : ['shift', '7'], r"'('" : ['shift', '8'], r"')'" : ['shift', '9'], r"'_'" : ['shift', '-'], r"'+'" : ['shift', '='], r"':'" : ['shift', ';'], r"'\"'" : ['shift', "'"], r"'
还没有评论,来说两句吧...