Python实现简易小钢琴

Python实现简易小钢琴

使用Python和内带的Tkinter库、winsound 模块实现的简单小钢琴。

Tkinter库和winsound模块不需要额外安装就可以使用,因为它们是Python的标准库之一,已经随着Python的安装包一起提供。标准库是Python官方提供的一组核心模块和工具,它们被视为Python语言的一部分,因此在安装Python解释器时就会自动包含这些标准库。

Tkinter库是Python的标准图形用户界面(GUI)工具包,它提供了创建和管理GUI应用程序所需的组件和功能。Tkinter基于Tcl/Tk工具包,是Python内置的库,因此无需额外安装。

winsound模块是Python的标准库之一,用于在Windows操作系统中播放声音。它提供了简单的接口,它提供了一些用于控制Windows系统声音的函数,比如播放声音、发出蜂鸣声等,可以用于播放系统提供的声音文件或者自定义的声音。

我对乐了解几乎为零,相关音高(pitch)可以参考这里https://www.autopiano.cn/toolbox/pitch

以下是一个使用Python和内带的Tkinter库、winsound 模块实现的简单钢琴程序的源码:

import tkinter as tk
import winsound  # 注意:winsound 模块只在 Windows 上可用

# 定义一个播放声音的函数
def play_sound(frequency):
    winsound.Beep(frequency, 500)  # 播放500毫秒的声音

# 创建主窗口
root = tk.Tk()
root.title("The Little Piano")

# 定义音符和对应的频率
notes = {
    'a': 261,
    's': 294,
    'd': 329,
    'f': 349,
    'g': 392,
    'h': 440,
    'j': 494,
    'k': 523
}

# 创建一个函数来生成钢琴键
def create_key(note):
    def on_click(e=None):
        play_sound(notes[note])
        # 按下键的视觉反馈
        button.config(relief=tk.SUNKEN)
        button.after(100, lambda: button.config(relief=tk.RAISED))
    
    button = tk.Button(root, text=note, width=5, height=5, command=on_click)
    button.pack(side=tk.LEFT, padx=5, pady=5)
    root.bind(note.lower(), on_click)  # 绑定按键事件

# 为每个音符创建一个钢琴键
for note in notes:
    create_key(note)

# 启动Tkinter事件循环
root.mainloop()

运行效果如下:

你可以用英文状态下按下琴键上的字符,或用鼠标单击琴键试试了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/402653.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MFC 多文档程序的基本编程

下载了一个openGL mfc的多文档程序,以此来学习mfc多文档模式的编程; 它每次新建一个文档,会在窗口绘制一个三角形、一个矩形;如果没有了图形刷新一下; 先看一下为什么每次打开新文档会绘制图形; 生成工程之后主要有5个类,比单文档程序多了一个子框架类; 可以打开多个…

C++:STL简介

1. 什么是STL STL(standard template libaray- 标准模板库 ) : 是 C 标准库的重要组成部分 ,不仅是一个可复用的组件库,而且 是一个包罗数据结构与算法的软件框架 。 2. STL的版本 3. STL的六大组件 4.STL的缺陷 1. STL库的更新太慢了。这…

计算机设计大赛 深度学习乳腺癌分类

文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度,召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…

【海贼王的数据航海:利用数据结构成为数据海洋的霸主】时间复杂度 | 空间复杂度

目录 1 -> 算法效率 1.1 -> 如何衡量一个算法的好坏? 1.2 -> 算法的复杂度 2 -> 时间复杂度 2.1 -> 时间复杂度的概念 2.2 -> 大O的渐进表示法 2.3 -> 常见时间复杂度计算 3 -> 空间复杂度 4 -> 常见复杂度对比 1 -> 算法效…

第2部分 基础篇 第2章 隐私计算技术简介(1)

2.6.1. 隐私计算技术解决什么问题? 本聪老师:关于隐私计算,我想先问大家一个问题:隐私计算技术能够解决什么问题? 小明:是不是应该是保护用户的隐私。 本聪老师:可以这么说,但是怎…

一 些有代表性的相位解包裹算法

Itoh首先给出了传统解包裹算法的数学描述!。传统的相位解包裹操作是通过对空间相邻点相位值的比较来完成的。根据抽样定理,如果相邻采样点的相位差不超过z,则对应的相位解包裹处理是非常简单的,理论上以某点为起始点沿某一路径对包裹相位的差…

如何使用Docker部署MongoDB并结合内网穿透实现远程访问本地数据库

文章目录 前言1. 安装Docker2. 使用Docker拉取MongoDB镜像3. 创建并启动MongoDB容器4. 本地连接测试5. 公网远程访问本地MongoDB容器5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定TCP地址远程访问 正文开始前给大家推荐个网站,前些天发现了一个巨牛的 …

机器学习第二十八周周报 PINNs2

文章目录 week28 PINNs2摘要Abstract一、Lipschitz条件二、文献阅读1. 题目数据驱动的偏微分方程2. 连续时间模型3. 离散时间模型4.结论 三、CLSTM1. 任务要求2. 实验结果3. 实验代码3.1模型构建3.2训练过程代码 小结参考文献 week28 PINNs2 摘要 本文主要讨论PINN。本文简要…

如何利用内网穿透工具在企业微信开发者中心实现本地接口服务回调

文章目录 1. Windows安装Cpolar2. 创建Cpolar域名3. 创建企业微信应用4. 定义回调本地接口5. 回调和可信域名接口校验6. 设置固定Cpolar域名7. 使用固定域名校验 企业微信开发者在应用的开发测试阶段,应用服务通常是部署在开发环境,在有数据回调的开发场…

猫头虎分享已解决Bug || Web服务故障:WebServiceUnavailable, HTTPServerError

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

跑步也要飙起来:南卡、韶音、墨觉骨传导耳机大比拼

作为一个热衷于运动同时又不能离开音乐的人,我总是在寻找一款既能让我自由奔跑,又能享受到美妙音乐的耳机。记得买耳机前,朋友都说骨传导耳机就像个小喇叭,漏音厉害,我却不这么认为。对我来说,骨传导耳机不…

Pormise---如何解决javascript中回调的信任问题?【详解】

如果阅读有疑问的话,欢迎评论或私信!! 本人会很热心的阐述自己的想法!谢谢!!! 文章目录 回调中的信任问题回调给我们带来的烦恼?调用过早调用过晚调用的次数太少或太多调用回调时未能…

【Django】Django自定义后台表单——对一个关联外键对象同时添加多个内容

以官方文档为例: 一个投票问题包含多个选项,基本的表单设计只能一个选项一个选项添加,效率较低,如何在表单设计中一次性添加多个关联选项? 示例代码: from django.contrib import adminfrom .models impo…

game项目(梦开始的地方)

梦开始的地方 由于easyx只支持vis&#xff0c;所以这个项目的书写以后都是在vis上进行&#xff0c;希望自己能够把这个项目好好完成&#xff0c;相信自己&#xff0c;加油&#xff01; 我们需要一个头文件来包括作图工具 (这个头文件在easyx上面下载) #include<graphics.…

2024.2.21 模拟实现 RabbitMQ —— 实现转发规则

目录 需求分析 直接交换机&#xff08;Direct &#xff09; 主题交换机&#xff08;Topic &#xff09; 扇出交换机&#xff08;Fanout &#xff09; Topic 交换机转发规则 routingKey 组成 bindingKey 组成 匹配规则 情况一 情况二 情况三 实现 Router 类 校验 b…

为新固态硬盘安装操作系统

目录 背景方案具体步骤1 为新硬盘进行分区2 下载Dism3 下载win10的iso文件4 通过Dism 重装系统5 从biso调整启动顺序5 遗留问题 参考资料 背景 情况是这样的&#xff0c;我的电脑本来就有一块sata的固态硬盘&#xff0c;作为c盘&#xff0c;装载的是win10系统。 一方面只有500…

滚雪球学Java(68):全面了解Java中常用的集合类:LinkedHashMap的应用与实践

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

【JAVA高级面试题】运用锁机制实现一个自定义的阻塞队列

文章目录 前言实战演示写在最后 前言 前几天看见一个高级Java面试题&#xff0c;我觉得很有代表意义。既考察了面试者的基本锁机制运用&#xff0c;也了解了阻塞队列的产生实现原理。先分享出来&#xff0c;以供鉴赏。 面试题&#xff1a;实现一个自定义的阻塞队列&#xff0c…

git@github.com: Permission denied (publickey).

这个问题是使用git克隆自己的私有代码仓库时发现的&#xff0c;虚拟机中执行下面的指令生成了ssh私钥和公钥 ssh-keygen并且成功将公钥上传到了github上 但是执行git clone克隆私有仓库时依旧失败&#xff0c;报错内容和标题差不多 通过这个报错最终还是锁定了问题&#xff…

牛客网 JZ53 数字在升序数组中出现的次数

思路&#xff1a; 因为是非降序数组&#xff0c;所以可以通过二分法快速排查范围&#xff0c;等mid值找到对应k时&#xff0c;只需要往前找有多少个k和往后找有多少个k&#xff0c;计算出总数即可 答案&#xff1a; int GetNumberOfK(int* nums, int numsLen, int k ) {int…