2021/12/10更新

看到朋友们都很在关注这个内容,我花了一上午改进了一下代码,更加优雅一些,也更建议这样使用,当然是自己琢磨的啦!!!

import threading
from pynput.keyboard import Listener按键列表 = {"'1'": '1', "'2'": '2', "'3'": '3', "'4'": '4', "'5'": '5', "'6'": '6', "'7'": '7', "'8'": '8', "'9'": '9',"'0'": '0', "'a'": 'a', "'b'": 'b', "'c'": 'c', "'d'": 'd', "'e'": 'e', "'f'": 'f', "'g'": 'g', "'h'": 'h',"'i'": 'i', "'j'": 'j', "'k'": 'k', "'l'": 'l', "'m'": 'm',"'n'": 'n', "'o'": 'o', "'p'": 'p', "'q'": 'q', "'r'": 'r', "'s'": 's', "'t'": 't', "'u'": 'u', "'v'": 'v',"'w'": 'w', "'x'": 'x',"'y'": 'y', "'z'": 'z', "'A'": 'a', "'B'": 'b',"'C'": 'c', "'D'": 'd', "'E'": 'e', "'F'": 'f', "'G'": 'g', "'H'": 'h', "'I'": 'i', "'J'": 'j', "'K'": 'k',"'L'": 'l', "'M'": 'm',"'N'": 'n', "'O'": 'o', "'P'": 'p', "'Q'": 'q', "'R'": 'r', "'S'": 's', "'T'": 't', "'U'": 'u', "'V'": 'v',"'W'": 'w', "'X'": 'x',"'Y'": 'y', "'Z'": 'z', "Key.f1": "f1", "Key.f2": "f2", "Key.f3": "f3", "Key.f4": "f4", "Key.f5": "f5","Key.f6": "f6","Key.f7": "f7", "Key.f8": "f8", "Key.f9": "f9", "Key.f10": "f10", "Key.f11": "f11", "Key.f12": "f12","Key.esc": "esc","'`'": "`","Key.tab": "tab", "Key.caps_lock": "caps_lock", "Key.shift": "shift", "Key.shift_r": "shift","Key.ctrl_l": "ctrl", "<255>": "fn","Key.cmd": "win","Key.alt_l": "alt", "Key.space": "space", "Key.alt_r": "alt", "Key.menu": "menu", "Key.ctrl_r": "ctrl","','": ",","'.'": ".", "'/'": "/", "';'": ';', "\"'\"": "'", "'['": "[", "']'": "]", "Key.enter": "enter", "'\\'": "\\","'\\\\'": "、", "<12>": "5", "'*'": "*","'-'": "-","'='": "=", "'+'": "+", "Key.backspace": "backspace", "Key.print_screen": "print_screen","Key.insert": "insert","Key.delete": "delete", "Key.left": "left", "Key.down": "down", "Key.right": "right", "Key.up": "up","Key.home": "home","Key.end": "end", "Key.page_up": "page_up", "Key.page_down": "page_down", "Key.num_lock": "lock"}
快捷键最大长度 = 5# 固定长度为某一固定值的数组, 存储按下的按键
class speedList:def __init__(self):self.maxlen = 快捷键最大长度self.list = []def push(self, e):# 根据按键列表获取实际的按键名字try:self.list.append(按键列表[str(e)])except:print("没有这个按键: ", e)if (len(self.list) > self.maxlen):self.list.pop(0)def get(self):return self.list监听的数组 = speedList()# key: 快捷键字符串  value函数
函数map = {}def 监听按键后的处理(key):global 监听的数组监听的数组.push(key)for i in 获取所有组合():try:函数_list = 函数map[i]for now_函数 in 函数_list:now_函数()except:passdef 获取所有组合():# 如  a b c d 的组合有 d cd bcd abcdres = []数组 = 监听的数组.get()index = len(数组) - 1while index >= 0:s = ""for i in range(index, len(数组)):s += 数组[i]res.append(s)index -= 1return resdef 监听按键():with Listener(on_press=监听按键后的处理) as listener:listener.join()def 判断是否在数组里(定义的快捷键):# 只取前n个(n为快捷键的长度) , 防止重复执行如 快捷键为f  ccccf  会执行5次, 因为f一直在里面return 监听的数组.get().copy()[-len(定义的快捷键)::] == 定义的快捷键def 快捷键(*kwds):# 因为装饰器只会执行一次,所以这里是将函数列表添加进去,而不是进行判断操作global 函数mapdef decorate(f):global 函数mapif len(kwds) <= 快捷键最大长度:try:函数列表 = 函数map[元组转为字符串(kwds)]函数列表.append(f)函数map[元组转为字符串(kwds)] = 函数列表except:函数map[元组转为字符串(kwds)] = [f]else:print("快捷键最大长度为: ", 快捷键最大长度, " 快捷键", kwds, " 不符合要求")return freturn decoratedef 元组转为字符串(kwds):res = ""for i in kwds:res = res + i.lower()return resthreading.Thread(target=监听按键).start()

使用

from 监控按键 import 快捷键@快捷键("c")
def 第三个函数():print("我按下了c")@快捷键("ctrl", "v")
def 第三个函数():print("粘贴")@快捷键("a", "b", "c", "d", "e")
def 第三个函数():print("dadadadad")

----------------------------以下是原内容 ----------------------------

库:pynput
安装:pip install pynput
话不多说直接上代码:

from pynput.keyboard import Listener
import timedef on_press(key):passdef on_release(key):all_key.append(str(key))print(all_key)if "'r'" in all_key:print("开大招了")all_key.clear()if "'q'" in all_key:print("开q技能了")all_key.clear()if "'w'" in all_key:print("开w技能了")all_key.clear()if "'e'" in all_key:print("开e技能了")all_key.clear()if 'Key.ctrl_l' in all_key and "'c'" in all_key:  # ctrl+cprint('这是复制键')all_key.clear()if 'Key.ctrl_l' in all_key and "'v'" in all_key:  # ctrl+vprint('这是粘贴键')all_key.clear()try:if all_key[-1] == 'Key.ctrl_l':time1 = time.time()while True:if time.time() - time1 >= 1:all_key.clear()breakexcept:pass# if key == Key.esc:  # 停止监听#     return Falseurn Falsedef start_listen():with Listener(on_press=None, on_release=on_release) as listener:listener.join()if __name__ == '__main__':all_key = []start_listen()

基本思路

每当按下一个按键后,会将按下的按键名称添加进特定的列表all_key中,从而根据列表里面的元素进行判断,若符合则证明“按下了特定的按键”,从而执行想要执行的函数。

缺点

程序中有一个all_key.clear()函数,是清除列表的所有元素,那么什么时候清除是一个问题。比如我按下了Ctrl键,那么’Key.ctrl_l’元素就会添加进去,但是我过了一会儿再按下c键,这时程序就会根据列表中有’Key.ctrl_l’和’c’从而认为我们按下了复制快捷键,可是我们并没有按下Ctrl+c。

我在想根据元素添加的时间来判断,比如检测到列表中有’Key.ctrl_l’元素,过0.5秒后再进行检测看有没有‘c’元素,如果有则证明按下了复制快捷键,如果没有检测到‘c’那么就执行all_key.clear()函数。
总之什么时候执行all_key.clear()函数是需要解决的问题

Python如何按下指定按键后执行特定的操作相关推荐

  1. Spring boot 启动后执行特定的操作

    有时候我们需要在应用启动完成后执行一些特定的操作,比如: 删除一些临时文件或者Redis中的缓存 将一些字典类的数据加载到缓存,这样就不用每次去数据库中查了,有些关联数据从缓存中取得赋值就可以了,不再 ...

  2. python如何在所有线程结束后执行最后操作_Python线程的生命周期

    在线程的生命周期中,从创建到执行以及最终终止,线程通常处于四种状态之一:开始态.可调度状态.阻塞态和终止态. 父线程和子线程 当一个新的进程或程序开始运行时,它将以一个线程开始,这个线程被称为主线程. ...

  3. textbox控件输入内容后按下Enter键后执行button1的click方法

    对于Asp.Net.在TextBox1中输入内容后,按下enter键后,执行Button1的click方法,在page_load事件增加如下代码即可实现: TextBox1.Attributes.Ad ...

  4. crontab定时执行python脚本_linux下使用crontab定时执行python脚本

    工作中遇到需要定时每周执行所写的python脚本,本来想使用python的定时任务框架,结果网上发现linux中提供crontab可以执行定时任务,省了好多代码,下面分享一下crontab 语法介绍 ...

  5. python os.popen.readlines异常_python中执行sed命令操作源文件时出现错误

    我想在python中执行一个sed命令,第一种方法直接指定文件时,可以正确输出结果,但是第二种我打开文件操作的时候就有问题,不知道什么原因,求高手解答?(1)>>>sedcmd=&q ...

  6. python中doc=parased.getroot()_python中执行sed命令操作源文件时出现错误

    我想在python中执行一个sed命令,第一种方法直接指定文件时,可以正确输出结果,但是第二种我打开文件操作的时候就有问题,不知道什么原因,求高手解答? (1) >>> sedcmd ...

  7. python从邮箱获取指定邮件_用python提取并统计指定邮箱里的特定邮件

    1.需求描述: 我们经常有这样的需求,需要某个邮箱中提取一个mailist的人员,发来的特定邮件,比如他们的周报,提交的patch等等.由于这是一个周期性的工作,有很大的重复和繁杂性,我们这里编写了一 ...

  8. python从邮箱获取指定邮件_用python提取并统计指定邮箱里的特定邮件 | 学步园

    1.需求描述: 我们经常有这样的需求,需要某个邮箱中提取一个mailist的人员,发来的特定邮件,比如他们的周报,提交的patch等等.由于这是一个周期性的工作,有很大的重复和繁杂性,我们这里编写了一 ...

  9. task一个任务结束后执行另一个操作

    1 //创建一个任务 2 Task<int> task = new Task<int>(() => 3 { 4 int sum = 0; 5 //显示进度条遮照层, 6 ...

  10. Vue中如何设置在执行删除等危险操作时给用户提示(二次确认后执行对应的操作)

    在项目中.在执行删除等不可撤销操作时,要提示用户.等用户二次确认后.才执行对应的方法. 效果展示 点击删除 等待二次确认 确定删除 删除成功 1.Vue官网 Popconfirm 气泡确认框 点击元素 ...

最新文章

  1. 热修复测试过程注意事项
  2. 谈谈UI架构设计的演化
  3. html 的基本结构、标签(分类、关系)、文档类型、页面语言、字符集、语义化
  4. navision系统和sap区别_(三)SAP On Premise和SAP S/4 HANA Cloud的区别
  5. Redis最佳实践:业务层面和运维层面优化
  6. 廖雪峰python教程百度云-廖雪峰Python教程的配套视频教程,全套完整版!
  7. mysql rrd_关于cactiEZ数据迁移操作思路
  8. linux服务器视窗,linux窗口管理器介绍
  9. 使用jsonpath从kettle转换json2csv
  10. [蓝桥杯][算法提高VIP]夺宝奇兵-递推+记忆化搜索
  11. 虫食算(洛谷-P1092)
  12. c语言-基本计算 pm2.5,C语言程序设计题(A卷).doc
  13. IXWebHosting主机如何退款中文图解教程
  14. RedHat 9 Linux SendMail 的配置
  15. java 最少使用(lru)置换算法_[内附完整源码和文档] 基于C#的可视化虚拟存储器管理(LUR算法)...
  16. 安装TensorFlow中遇到的问题(汇总)
  17. 【转】打开,另存为,属性等14个javascript代码
  18. mysqldump备份所有数据库,恢复单个库的场景预演
  19. qtcreator 代码格式化工具使用
  20. 《大般涅槃经》略释 净慧法师

热门文章

  1. 同步调用、异步调用、回调的简单理解
  2. mysql emoy表情_emo表情包 - emo微信表情包 - emoQQ表情包 - 发表情 fabiaoqing.com
  3. 设计一个电商平台积分兑换系统
  4. 基于JAVA城市湖泊信息管理系统计算机毕业设计源码+系统+lw文档+部署
  5. 服务器机箱 改造 桌面,你的显卡站起来了吗?——桌面改造分享装机篇
  6. Flink Event Time / Processing Time / Ingestion Time (事件时间/处理时间/摄取时间)
  7. js问号点的作用(?.)和问号问号(??)的用法
  8. 教师节快乐:带大家回顾这十位大师笔下的教师!
  9. python程序设计基础教程ppt_Python程序设计基础教程
  10. 《人类简史》《未来简史》读后感作文5000字