我的编程空间,编程开发者的网络收藏夹
学习永远不晚

坤坤音效键盘(Python实现)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

坤坤音效键盘(Python实现)

文章目录

坤坤音效键盘说明

坤坤音效键盘说明:

  1. 单独按下 j、n、t、m j、n、t、m jntm 按键,会对应触发 “鸡”、“你”、“太”、“美” 音效。
  2. 连续按下 jntm jntm jntm 按键,会触发 “鸡你太美” 的较长音效。
  3. 连续按下 ngm ngm ngm 按键,会触发 “你干嘛” 的较长音效。
  4. 按下Esc按键,会触发 “鸡你太美版《澎湖湾》” 的长音效。
  5. 按下左Ctrl键,会触发 “鸡你太美版《想某人》” 的超长音效。
  6. 按下小键盘上的数字键或小数点键,停止播放音频并终止程序。

说明一下: 对于连续按键触发的音效,不要求快速连续按下,只要连续即可。

坤坤音效键盘效果展示

说明一下: 为了让大家知道我按下了哪些按键,视频中将我按下的按键进行了打印。

代码实现

安装第三方库

该程序需要用到以下两个第三方库:

  • playsound模块: 使用该模块中的playsound函数来播放音频。
  • pynput模块: 使用该模块中的Listener对象来监听键盘按键。

在命令行或终端中输入以下命令进行安装:

pip install pynput==1.6.8pip install playsound==1.2.2

说明一下: 这里下载第三方库时最好不要下载最新版本的。

准备音频

准备几个想要播放的音频,在Python程序所在目录下创建一个子目录,将这些音频文件放到这个子目录当中。比如:

在这里插入图片描述

说明一下: 博主的这些音频文件是在B站上找到的,大家可以去各个资源网站上下载音频文件,也可以自行录音。

监听键盘

监听键盘

监听键盘的步骤如下:

  1. 通过from关键字导入pynput模块中的keyboard模块。
  2. 创建一个listener对象,创建对象时为其设置一个回调函数。
  3. 调用listener对象的start方法,让listener开始监听键盘按键。
  4. 调用listener对象的join方法,防止程序直接退出(listener本质是一个线程)。

代码如下:

from pynput import keyboarddef onRelease(key):    print(f'用户输入: {key}')listener = keyboard.Listener(on_release=onRelease)listener.start()listener.join()

此时每当按键被敲击时,listener就会自动调用我们设置的回调函数,进而打印出被敲击的按键。

在这里插入图片描述

说明一下:

  • Listener的构造函数主要有两个参数,一个是on_press,另一个是on_release,设置给on_press的回调函数会在按键被按下时调用,而设置给on_release的回调函数会在按键被释放时调用。
  • 构造Listener对象时,设置给on_press和on_release的回调函数必须有一个参数,该参数在按键被按下或释放时由Listener自动传入,表示被按下或释放的按键。

普通键和特殊键

虽然在回调函数中通过print能够直接打印出被按下的按键,但实际这个参数并不是字符串类型的,我们不能将该参数直接与字符串进行比较,这样得不到正确的比较结果。

正确的做法如下:

  • 如果用户按下的是普通键(键盘上所有的字母、数字、符号),可以通过参数对象的char成员变量得知用户按下的是哪个按键,这个char成员变量的类型是字符串str类型的。
  • 如果用户按下的是特殊键(普通键以外的按键),可以通过参数对象的name成员变量得知用户按下的是哪个按键,这个name成员变量的类型是字符串str类型的。

但实际我们并不知道用户本次按键按下的是普通键还是特殊键,并且如果用户按下的是普通键,那么参数对象是没有name成员变量的,反之,如果用户按下的是特殊键,那么参数对象是没有char成员变量的。如果访问了不存在的成员变量,那么程序就会抛出异常AttributeError

这时可以借助异常来进行处理:

  • 将处理普通键的代码逻辑放到try块中,将处理特殊键的代码逻辑放到except块中。
  • 当用户按下按键后,会先执行try块中的代码逻辑,如果用户按下的是普通键,那么程序不会抛出异常,正常执行。
  • 如果用户按下的是特殊键,那么当访问参数对象的char成员变量时就会抛出异常AttributeError,但由于我们对异常AttributeError进行了捕捉,因此程序不会终止,此时执行流会跳转到except块中,执行except块中处理特殊键的代码逻辑。

代码如下:

def onRelease(key):    try:        print(f'用户输入: {key.char}')        print(type(key.char))  #     except AttributeError:        print(f'用户输入: {key.name}')        print(type(key.name))  # 

判断特殊键的另一种方式

当用户按下的是特殊键时,除了通过参数对象的name成员变量得知用户按下的是哪个按键之外,还可以通过如下方式进行比较:

# 下面两种比较方式都可以if key.name == 'ctrl_l':    print('用户按下的是左Ctrl键')if key == keyboard.Key.ctrl_l:    print('用户按下的是左Ctrl键')

说明一下: Key是keyboard模块中的一个枚举类,Key中枚举出了各个特殊键。

播放音频

播放音频

播放音频的步骤如下:

  1. 通过from关键字导入playsound模块中的playsound函数。
  2. 调用playsound函数时,传入需要播放的音频的路径。

代码如下:

from playsound import playsoundplaysound('sound/j.mp3')

编写逻辑

建立映射关系

为了能够快速获得一个字符串对应的音频路径,可以使用字典建立字符串与对应音频的映射关系。

代码如下:

# 建立字符串与对应音频的映射letterToAudio = {    'j': 'sound/j.mp3',    'n': 'sound/n.mp3',    't': 'sound/t.mp3',    'm': 'sound/m.mp3',    'jntm': 'sound/jntm.mp3',    'ngm': 'sound/ngm.mp3',    'esc': 'sound/phw.mp3',    'ctrl_l': 'sound/xmr.mp3'}

编写逻辑

代码逻辑的编写如下:

  • 将处理普通键的代码逻辑放到try块中,将处理特殊键的代码逻辑放到except块中。
  • 为了实现特定连续按键触发特定音频的功能,需要用history变量记录历史敲击过的字母,每当按键被敲击时就可以通过history变量来判断是否触发连续字母音效了。
  • 在处理普通键时,需要优先判断是否触发连续字母音效,如果没有触发连续字母音效再判断是否触发单字母音效,因为触发连续字母音效的最后一个字母可能也会触发单字母音效。
  • 在处理特殊键时,直接判断用户按下的按键是否会触发音效即可。

代码如下:

history = ''  # 记录历史敲击过的字母def onRelease(key):    global history    audio = ''    try:        print(f'用户输入: {key.char}')        # 记录敲击过的字母        if len(history) < 4:            history += key.char        else:            history = history[1:] + key.char        # 优先判断是否触发连续字母音效,再判断是否触发单字母音效        if history == 'jntm':            audio = letterToAudio[history]        elif history[-3:] == 'ngm':            audio = letterToAudio[history[-3:]]        elif key.char in 'jntm':            audio = letterToAudio[key.char]    except AttributeError:        print(f'用户输入: {key.name}')        # 按下的不是普通键,可以把history清空        history = ''        # 判断是否触发音效        if key == keyboard.Key.esc:            audio = letterToAudio['esc']        elif key == keyboard.Key.ctrl_l:            audio = letterToAudio['ctrl_l']    # 判断是否本次敲击按键是否触发音效    if audio != '':        playsound(audio)

说明一下:

  • 变量history没必要将历史敲击过的字母全部记录下来,因为这里触发连续字母音效的最长连续字母就是'jntm',长度为4,因此history只需要记录最近4次敲击过的字母即可。
  • 在判断是否触发'ngm'的连续音效时,history的长度可能为3,也可能为4,这时需要通过负索引的方式对history进行切片操作,保证是在用history中的后三个字母在进行判断。

引入线程

当前程序存在的问题

现在我们编写的代码已经可以运行了,但当前的效果体验并不好:

  • 在播放音频的时候我们打字会卡顿,并且在当前音频未播放完之前的按键无法触发其他音频。
  • 根本原因就是因为此时监听键盘按键和播放音频都是由同一个线程处理的,因此线程在播放音频的时候无法监听键盘按键。

为了解决这个问题,我们可以在调用playsound播放音频的时候创建一个线程,让该线程去执行播放音频的动作,而让当前线程继续进行按键监听操作。

引入线程

引入线程的步骤如下:

  1. 通过from关键字导入threading模块中的Thread类(threading是标准库中的模块,不需要额外安装)。
  2. 创建线程时需要创建一个Thread对象,然后调用Thread对象的start方法启动线程。
  3. 在创建Thread对象时,需要通过target参数指定该线程启动后要执行的程序例程,通过args参数指定调用该程序例程时需要传入的参数。

代码如下:

# 创建线程对象,并指定其要执行的程序例程t = Thread(target=playsound, args=(audio, ))# 启动线程t.start()

说明一下:

  • 创建Thread对象时,传入的args参数的类型是元组类型,因此如果只需要传入一个参数,就需要以(arg, )的方式传入,这后面这个逗号是不可省略的,否则就不是元组类型了。
  • Python默认创建线程后,不管主线程是否执行完毕,都会等待子线程执行完毕才一起退出,因此主线程是否join子线程结果都一样。
  • 如果这里调用了join,那么监听键盘按键的线程就会被阻塞,直到子线程将音频播放完毕,此时音频的播放过程变成了串行的。

完整代码

引入线程后的完整代码如下,此时在播放音频的时候敲键盘就不会存在卡顿现象,并且在音频播放期间能够再次触发其他音频。

from pynput import keyboardfrom playsound import playsoundfrom threading import Thread# 建立字符串与对应音频的映射letterToAudio = {    'j': 'sound/j.mp3',    'n': 'sound/n.mp3',    't': 'sound/t.mp3',    'm': 'sound/m.mp3',    'jntm': 'sound/jntm.mp3',    'ngm': 'sound/ngm.mp3',    'esc': 'sound/phw.mp3',    'ctrl_l': 'sound/xmr.mp3'}history = ''  # 记录历史敲击过的字母def onRelease(key):    global history    audio = ''    try:        print(f'用户输入: {key.char}')        # 记录敲击过的字母        if len(history) < 4:            history += key.char        else:            history = history[1:] + key.char        # 优先判断是否触发连续字母音效,再判断是否触发单字母音效        if history == 'jntm':            audio = letterToAudio[history]        elif history[-3:] == 'ngm':            audio = letterToAudio[history[-3:]]        elif key.char in 'jntm':            audio = letterToAudio[key.char]    except AttributeError:        print(f'用户输入: {key.name}')        # 按下的不是普通键,可以把history清空        history = ''        # 判断是否触发音效        if key == keyboard.Key.esc:            audio = letterToAudio['esc']        elif key == keyboard.Key.ctrl_l:            audio = letterToAudio['ctrl_l']    # 判断是否本次敲击按键是否触发音效    if audio != '':        # 创建线程对象,并指定其要执行的程序例程        t = Thread(target=playsound, args=audio)        # 启动线程        t.start()listener = keyboard.Listener(on_release=onRelease)listener.start()listener.join()

打包成exe程序

一、打包资源文件夹

当前项目播放音频时需要用到的音频文件就叫做资源文件,博主将这些资源文件放在了一个名为sound的文件夹中。如下:

在这里插入图片描述

二、修改KunKunKeyboard.py文件

我们需要在KunKunKeyboard.py文件中加入如下函数,该函数是用于生成资源文件的访问路径的。

# 生成资源文件访问路径def resource_path(relative_path):    if getattr(sys, 'frozen', False):  # 是否Bundle Resource        base_path = sys._MEIPASS    else:        base_path = os.path.abspath(".")    return os.path.join(base_path, relative_path)

代码中所有使用资源文件路径的地方,都需要通过调用该函数来生成资源文件的访问路径,然后再通过这个生成的路径来访问资源文件,我们只需要将字典中的内容更改一下即可。如下:

# 建立字符串与对应音频的映射letterToAudio = {    'j': resource_path(os.path.join('sound', 'j.mp3')),    'n': resource_path(os.path.join('sound', 'n.mp3')),    't': resource_path(os.path.join('sound', 't.mp3')),    'm': resource_path(os.path.join('sound', 'm.mp3')),    'jntm': resource_path(os.path.join('sound', 'jntm.mp3')),    'ngm': resource_path(os.path.join('sound', 'ngm.mp3')),    'esc': resource_path(os.path.join('sound', 'phw.mp3')),    'ctrl_l': resource_path(os.path.join('sound', 'xmr.mp3'))}

说明一下: join是os.path模块中的一个函数,它的作用是将多个路径进行拼接。

三、准备图标文件

如果你想要修改生成的exe程序的图标的话,那么你需要准备一个 32 × 32 32\times32 32×32像素的图片文件,图片文件需要为ico格式,可以使用百度的JPG在线转ICO:https://www.aconvert.com/cn/icon/jpg-to-ico/
在这里插入图片描述

将生成的图标文件KunKunKeyboard.py的同级目录下。如下:

在这里插入图片描述

三、生成KunKunKeyboard.spec文件并修改

在命令行或终端中输入以下命令,生成KunKunKeyboard.spec文件:

pyi-makespec -F -i logo.ico KunKunKeyboard.py

此时在KunKunKeyboard.py的同级目录下会生成一个KunKunKeyboard.spec文件。如下:
在这里插入图片描述

此时,打开KunKunKeyboard.spec文件,并将做如下修改:

在这里插入图片描述
说明一下:

  • 在修改之前,datas的值为一个空列表,即datas=[]
  • 这里修改的意思是,将KunKunKeyboard.py目录下的sound目录及其该目录中的文件加入生成的exe程序中,在运行时放在临时文件的根目录下,名称为sound。

四、生成exe程序

最后在命令行或终端中输入以下命令:

pyinstaller KunKunKeyboard.spec

此时在KunKunKeyboard.py的同级目录下会生成一个dict目录,生成的exe程序就在该目录中。如下:
在这里插入图片描述

拓展内容(非必须)

如果在修改KunKunKeyboard.spec时,同时将console的值设置为False。如下:

在这里插入图片描述

那么此时生成的exe程序在运行时将不会弹出窗口,程序运行后也不会在任务栏显示。需要注意的是,如果要这样做,需要将程序中两处调用print函数的地方注释掉,因为此时没有窗口供print输出,如果print被调用那么程序将会抛异常。

此时要终止这个程序有以下几种方法:

  • 打开任务管理器,找到该进程将其终止。
  • 关机重启。
  • 按下小键盘上的数字键,让程序因抛异常而终止。

说明一下: 代码中没有考虑小键盘中的数字按键和小数点按键,当这些按键被按下时会抛出没有被捕获到的异常,可以将这些按键当作暂停键。

来源地址:https://blog.csdn.net/chenlong_cxy/article/details/127585044

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

坤坤音效键盘(Python实现)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python实现监听键盘

python实现监听键盘,供大家参考,具体内容如下实现服务端import pickle from io import BytesIO import socket#接收数据 def Server_Recive(ip,port):socket_
2022-06-02

python怎么实现监听键盘

小编给大家分享一下python怎么实现监听键盘,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Python的优点有哪些1、简单易用,与C/C++、Java、C# 等
2023-06-14

使用Python实现操作控制鼠标和键盘

本文介绍了使用Python实现鼠标和键盘操作的详细指南。使用pyautogui库,程序员可以方便地执行常见操作,包括移动鼠标、单击按钮和键入文本。该库提供了一系列函数,如moveTo()、click()和write(),使操作自动化变得简单。此外,pyautogui还允许自定义操作,例如模拟键盘快捷键。文中强调了pyautogui依赖于底层系统,并且可能存在局限性,例如干扰正常用户操作。
使用Python实现操作控制鼠标和键盘
2024-04-02

python使用canvas怎么实现移动并绑定键盘

python使用canvas怎么实现移动并绑定键盘,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、任务用多个按钮或者按钮+文本框实现不同物体(椭圆,长方形,扇
2023-06-22

Android编程实现webview执行loadUrl时隐藏键盘的workround效果

本文实例讲述了Android编程实现webview执行loadUrl时隐藏键盘的workround效果。分享给大家供大家参考,具体如下: webview执行loadUrl时隐藏键盘的workround 在写webapp的时候,经常需要用JS
2022-06-06

Python如何利用PyAutoGUI模块实现控制鼠标键盘

这篇文章主要介绍“Python如何利用PyAutoGUI模块实现控制鼠标键盘”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python如何利用PyAutoGUI模块实现控制鼠标键盘”文章能帮助大家解
2023-07-02

Python代码如何实现截屏键盘记录远程发送

本篇文章为大家展示了Python代码如何实现截屏键盘记录远程发送,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。这年头盗号的从出不穷,不是脱裤就是社工钓鱼。今天呢我们就以前面的几篇技术文章做铺垫,来讲
2023-06-17

如何高效禁用windows8屏幕触摸键盘(通过停用服务实现)

除非我不需要它或不想看到它。我有一台Lenovo X1 Carbon Touch,并且它已经有一个键盘。我从来都没想要用Windows8触摸键盘。不幸的是没有复选框或者“只是把它关掉“的方式来禁用键盘可供选择。然而,
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录