python pynput键盘监听响应事件(已封装成类)

1.完整代码

简单介绍:
  1.响应事件
    连续按下qqq触发函数test((1,2,3),{“1”:2})
    连续按下awa触发函数test([],{})
    连续按下ppppp触发默认事件关闭监听
  2.关于初始化参数
    listen_lst就是用户自定义的响应事件
    time.min是按键最短间隔,超时会清零
    str_len是记录按键的最大长度
    end_key是默认监听事件关闭的

from pynput.keyboard import Listener
import time
class listen:
    def __init__(self,listen_lst,time_min=0.5,str_len=30,end_key="ppppp"):
        #listen_lst:["qqqq",func,args,kwargs],按下qqqq后调用函数func(*args,**kwargs)
        #time.min代表按键最短间隔,超过时间则按键清零
        #str_len 最长监听长度
        self.listen_lst=sorted(listen_lst,key=lambda x:len(x[0]))#按照"qqqq"长度排序
        self.listen_lst.append([end_key,self.stop_listen,[],{}])
        self.time_min=time_min
        self.now_str=""
        self.str_len=str_len
        self.now_time=time.time()
        self.listener=None
    def on_press(self,key):
        key=str(key).replace("'","")
        mid_time=time.time()
        if mid_time>self.now_time+self.time_min:
            self.now_str=key
        else:
            self.now_str=self.now_str+key
        self.now_time=mid_time
        if len(self.now_str)>self.str_len:
            self.now_str=self.now_str[-self.str_len:]
        for item in self.listen_lst:
            listen_key=item[0]
            now_str=self.now_str[-len(listen_key):]
            if (listen_key==now_str):
                print("按下",now_str)
                item[1](*item[2],**item[3])
    def stop_listen(self):
        if self.listener is not None:
            self.listener.stop()
    def run(self):
        with Listener(on_press=self.on_press) as listener:
            self.listener=listener
            listener.join()
def test(*args,**kwargs):
    print("test",args,kwargs)
if __name__ == '__main__':
    a=listen([["qqq",test,(1,2,3),{"1":2}],["awa",test,[],{}]])
    a.run()

2.测试结果

运行测试代码连续按键qqqawappppp打印的数据

按下 qqq
test (1, 2, 3) {'1': 2}
按下 awa
test () {}
按下 ppppp

3.类的补充(TODO)

1.将监听事件放入线程
2.enter等非字符串按键未作处理(如ctrl+a无法监听,需要完善)

4.如有疑惑请直接评论或发邮箱

luzhanzhisifangxiu@163.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值