Python-基于PyQt5,json和playsound的通用闹钟

前言:刚刚结束2024年秋季学期的学习,接下来我们继续来学习PyQt5。由于之前我们已经学习了PyQt5以及PyUIC,Pyrcc和QtDesigner的安装,配置。所以接下来我们一起深入PyQt5,学习如何利用PyQt5进行实际开发-基于PyQt5,json和playsound的通用闹钟。本次编程我们将会调用Python中的第三方库(如PyQt5playsound),大家需要提前下再好。此外我们也将会利用到Python的众多标准库实现整个程序的正常运行(如datetime,json,warning,sys等)。好,话不多说,我们直接开始今天的学习。

 第一步:导入库

我们需要sys,以便我们对PyCharm相关的操作和变量的访问。json,它提供了对JSON数据的编码和解码功能。接着我们导入标准库datetime。datetime类用于处理日期和时间(这个在后面的非重复,单日还是单周,月闹钟提醒设置里面非常重要),timedelta类用于表示时间间隔(这个为实现倒计时和设置计时功能提供了可能)。接下来是PyQt5的相关类和模块:QTimer类用于创建定时器;QTime类用于处理时间;QtWidgets模块包含了所有的GUI组件,如按钮、标签、文本框等;QIcon类用于创建图标。我们导入playsound函数用来播放音频文件(mp3格式的音频文件)。最后我们导入Python的标准库warnings来提供了对警告信息的控制(这里主要是我在后续调试代码过程中老是出现一些无关紧要的控制台警告,干脆保持静默得了)。

#导入必要库
import sys
import json
from datetime import datetime, timedelta
from PyQt5.QtCore import Qt, QTimer, QTime
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QIcon
from playsound import playsound
import warnings

第二步:静默警告信息(禁用部分函数)

采用忽略警告的方式静默警告。

warnings.filterwarnings("ignore", category=DeprecationWarning)

第三步:搭建环境并创建闹钟类

这里我们需要保证解释器安装有必要的Python环境:1,PyQt5,playsound等。2, 准备铃声文件:alarm.mp3(这里我给大家介绍一款可录屏,录音的免费软件ocam,我的mp3文件就是用ocam制作的)。3,准备图标文件:alarm.png(这个也需要大家自行准备,png格式的闹钟图片,示例如下)

#闹钟类
class AdvancedAlarmClock(QMainWindow):def __init__(self):super().__init__()self.alarms = []self.timers = []self.current_alarm = Noneself.snooze_time = 5self.initUI()self.load_alarms()def initUI(self):self.setWindowTitle('高级闹钟')self.setGeometry(300, 300, 216, 286)self.setWindowIcon(QIcon('alarm.png'))# 主控件main_widget = QWidget()self.setCentralWidget(main_widget)layout = QVBoxLayout()# 闹钟设置区域alarm_setting = QGroupBox("新建闹钟")alarm_layout = QHBoxLayout()self.time_edit = QTimeEdit()self.time_edit.setDisplayFormat("HH:mm")alarm_layout.addWidget(self.time_edit)self.repeat_combo = QComboBox()self.repeat_combo.addItems(["不重复", "每天", "工作日", "周末", "自定义..."])alarm_layout.addWidget(self.repeat_combo)self.sound_combo = QComboBox()self.sound_combo.addItems(["默认铃声", "铃声1", "铃声2"])alarm_layout.addWidget(self.sound_combo)add_btn = QPushButton("添加闹钟")add_btn.clicked.connect(self.add_alarm)alarm_layout.addWidget(add_btn)alarm_setting.setLayout(alarm_layout)layout.addWidget(alarm_setting)# 闹钟列表self.alarm_list = QListWidget()layout.addWidget(self.alarm_list)# 控制按钮control_layout = QHBoxLayout()del_btn = QPushButton("删除闹钟")del_btn.clicked.connect(self.delete_alarm)control_layout.addWidget(del_btn)snooze_btn = QPushButton("贪睡 (%d分钟)" % self.snooze_time)snooze_btn.clicked.connect(self.snooze_alarm)control_layout.addWidget(snooze_btn)layout.addLayout(control_layout)# 倒计时和计时器timer_group = QGroupBox("计时功能")timer_layout = QHBoxLayout()self.countdown_spin = QSpinBox()self.countdown_spin.setRange(1, 120)self.countdown_spin.setSuffix(" 分钟")timer_layout.addWidget(self.countdown_spin)countdown_btn = QPushButton("开始倒计时")countdown_btn.clicked.connect(self.start_countdown)timer_layout.addWidget(countdown_btn)self.timer_label = QLabel("00:00:00")timer_layout.addWidget(self.timer_label)timer_btn = QPushButton("启动计时器")timer_btn.clicked.connect(self.start_timer)timer_layout.addWidget(timer_btn)timer_group.setLayout(timer_layout)layout.addWidget(timer_group)main_widget.setLayout(layout)# 定时检查闹钟self.check_timer = QTimer()self.check_timer.timeout.connect(self.check_alarms)self.check_timer.start(1000)  # 每秒检查一次def add_alarm(self):alarm_time = self.time_edit.time().toString("HH:mm")repeat_mode = self.repeat_combo.currentText()sound = self.sound_combo.currentText()alarm = {"time": alarm_time,"repeat": repeat_mode,"sound": sound,"enabled": True}self.alarms.append(alarm)self.update_alarm_list()self.save_alarms()def delete_alarm(self):selected = self.alarm_list.currentRow()if selected >= 0:del self.alarms[selected]self.update_alarm_list()self.save_alarms()def update_alarm_list(self):self.alarm_list.clear()for alarm in self.alarms:status = "✓" if alarm["enabled"] else "✗"item = QListWidgetItem(f"{alarm['time']} | {alarm['repeat']} | {alarm['sound']} {status}")self.alarm_list.addItem(item)def check_alarms(self):now = datetime.now().strftime("%H:%M")for alarm in self.alarms:if alarm["enabled"] and alarm["time"] == now:self.trigger_alarm(alarm)def trigger_alarm(self, alarm):self.current_alarm = alarmalarm["enabled"] = False# 播放声音try:playsound('alarm.mp3')except:pass# 显示窗口msg = QMessageBox()msg.setWindowTitle("闹钟提醒")msg.setText(f"时间到!当前时间 {alarm['time']}")msg.setStandardButtons(QMessageBox.Ok)msg.exec_()self.update_alarm_list()self.save_alarms()def snooze_alarm(self):if self.current_alarm:snooze_time = datetime.now() + timedelta(minutes=self.snooze_time)self.alarms.append({"time": snooze_time.strftime("%H:%M"),"repeat": "不重复","sound": self.current_alarm["sound"],"enabled": True})self.update_alarm_list()self.save_alarms()def start_countdown(self):minutes = self.countdown_spin.value()end_time = datetime.now() + timedelta(minutes=minutes)timer = QTimer()timer.timeout.connect(lambda: self.update_countdown(timer, end_time))timer.start(1000)self.timers.append(timer)def update_countdown(self, timer, end_time):remaining = end_time - datetime.now()if remaining.total_seconds() <= 0:timer.stop()self.timer_label.setText("00:00:00")playsound('alarm.mp3')else:self.timer_label.setText(str(remaining).split('.')[0])def start_timer(self):self.timer_start_time = datetime.now()timer = QTimer()timer.timeout.connect(self.update_timer)timer.start(1000)self.timers.append(timer)def update_timer(self):elapsed = datetime.now() - self.timer_start_timeself.timer_label.setText(str(elapsed).split('.')[0])def save_alarms(self):with open("alarms.json", "w") as f:json.dump(self.alarms, f)def load_alarms(self):try:with open("alarms.json", "r") as f:self.alarms = json.load(f)self.update_alarm_list()except:pass

第四步:创建驱动单元

最后,我们将会用一个初始化单元来驱动整个程序运行。

​
#驱动单元
if __name__ == '__main__':app = QApplication(sys.argv)clock = AdvancedAlarmClock()clock.show()sys.exit(app.exec_())

第五步:完整代码展示

#导入必要库
import sys
import json
from datetime import datetime, timedelta
from PyQt5.QtCore import Qt, QTimer, QTime
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QIcon
from playsound import playsound
import warningswarnings.filterwarnings("ignore", category=DeprecationWarning)#闹钟类
class AdvancedAlarmClock(QMainWindow):def __init__(self):super().__init__()self.alarms = []self.timers = []self.current_alarm = Noneself.snooze_time = 5self.initUI()self.load_alarms()def initUI(self):self.setWindowTitle('高级闹钟')self.setGeometry(300, 300, 216, 286)self.setWindowIcon(QIcon('alarm.png'))# 主控件main_widget = QWidget()self.setCentralWidget(main_widget)layout = QVBoxLayout()# 闹钟设置区域alarm_setting = QGroupBox("新建闹钟")alarm_layout = QHBoxLayout()self.time_edit = QTimeEdit()self.time_edit.setDisplayFormat("HH:mm")alarm_layout.addWidget(self.time_edit)self.repeat_combo = QComboBox()self.repeat_combo.addItems(["不重复", "每天", "工作日", "周末", "自定义..."])alarm_layout.addWidget(self.repeat_combo)self.sound_combo = QComboBox()self.sound_combo.addItems(["默认铃声", "铃声1", "铃声2"])alarm_layout.addWidget(self.sound_combo)add_btn = QPushButton("添加闹钟")add_btn.clicked.connect(self.add_alarm)alarm_layout.addWidget(add_btn)alarm_setting.setLayout(alarm_layout)layout.addWidget(alarm_setting)# 闹钟列表self.alarm_list = QListWidget()layout.addWidget(self.alarm_list)# 控制按钮control_layout = QHBoxLayout()del_btn = QPushButton("删除闹钟")del_btn.clicked.connect(self.delete_alarm)control_layout.addWidget(del_btn)snooze_btn = QPushButton("贪睡 (%d分钟)" % self.snooze_time)snooze_btn.clicked.connect(self.snooze_alarm)control_layout.addWidget(snooze_btn)layout.addLayout(control_layout)# 倒计时和计时器timer_group = QGroupBox("计时功能")timer_layout = QHBoxLayout()self.countdown_spin = QSpinBox()self.countdown_spin.setRange(1, 120)self.countdown_spin.setSuffix(" 分钟")timer_layout.addWidget(self.countdown_spin)countdown_btn = QPushButton("开始倒计时")countdown_btn.clicked.connect(self.start_countdown)timer_layout.addWidget(countdown_btn)self.timer_label = QLabel("00:00:00")timer_layout.addWidget(self.timer_label)timer_btn = QPushButton("启动计时器")timer_btn.clicked.connect(self.start_timer)timer_layout.addWidget(timer_btn)timer_group.setLayout(timer_layout)layout.addWidget(timer_group)main_widget.setLayout(layout)# 定时检查闹钟self.check_timer = QTimer()self.check_timer.timeout.connect(self.check_alarms)self.check_timer.start(1000)  # 每秒检查一次def add_alarm(self):alarm_time = self.time_edit.time().toString("HH:mm")repeat_mode = self.repeat_combo.currentText()sound = self.sound_combo.currentText()alarm = {"time": alarm_time,"repeat": repeat_mode,"sound": sound,"enabled": True}self.alarms.append(alarm)self.update_alarm_list()self.save_alarms()def delete_alarm(self):selected = self.alarm_list.currentRow()if selected >= 0:del self.alarms[selected]self.update_alarm_list()self.save_alarms()def update_alarm_list(self):self.alarm_list.clear()for alarm in self.alarms:status = "✓" if alarm["enabled"] else "✗"item = QListWidgetItem(f"{alarm['time']} | {alarm['repeat']} | {alarm['sound']} {status}")self.alarm_list.addItem(item)def check_alarms(self):now = datetime.now().strftime("%H:%M")for alarm in self.alarms:if alarm["enabled"] and alarm["time"] == now:self.trigger_alarm(alarm)def trigger_alarm(self, alarm):self.current_alarm = alarmalarm["enabled"] = False# 播放声音try:playsound('alarm.mp3')except:pass# 显示窗口msg = QMessageBox()msg.setWindowTitle("闹钟提醒")msg.setText(f"时间到!当前时间 {alarm['time']}")msg.setStandardButtons(QMessageBox.Ok)msg.exec_()self.update_alarm_list()self.save_alarms()def snooze_alarm(self):if self.current_alarm:snooze_time = datetime.now() + timedelta(minutes=self.snooze_time)self.alarms.append({"time": snooze_time.strftime("%H:%M"),"repeat": "不重复","sound": self.current_alarm["sound"],"enabled": True})self.update_alarm_list()self.save_alarms()def start_countdown(self):minutes = self.countdown_spin.value()end_time = datetime.now() + timedelta(minutes=minutes)timer = QTimer()timer.timeout.connect(lambda: self.update_countdown(timer, end_time))timer.start(1000)self.timers.append(timer)def update_countdown(self, timer, end_time):remaining = end_time - datetime.now()if remaining.total_seconds() <= 0:timer.stop()self.timer_label.setText("00:00:00")playsound('alarm.mp3')else:self.timer_label.setText(str(remaining).split('.')[0])def start_timer(self):self.timer_start_time = datetime.now()timer = QTimer()timer.timeout.connect(self.update_timer)timer.start(1000)self.timers.append(timer)def update_timer(self):elapsed = datetime.now() - self.timer_start_timeself.timer_label.setText(str(elapsed).split('.')[0])def save_alarms(self):with open("alarms.json", "w") as f:json.dump(self.alarms, f)def load_alarms(self):try:with open("alarms.json", "r") as f:self.alarms = json.load(f)self.update_alarm_list()except:pass#驱动单元
if __name__ == '__main__':app = QApplication(sys.argv)clock = AdvancedAlarmClock()clock.show()sys.exit(app.exec_())

 第六步:操作指南 

1.设置新闹钟:
     - 选择时间
     - 设置重复模式
     - 选择铃声
     - 点击"添加闹钟" 
2.管理闹钟:
     - 双击列表项启用/禁用
     - 选择后点击"删除闹钟"
     - 响铃时点击"贪睡"延迟提醒
 3.计时工具**:
     - 倒计时:设置分钟数 → 开始倒计时
     - 秒表:直接启动计时器

第七步:运行效果展示

正常状态:

最大化:

最小化:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

预测不规则离散运动的下一个结构

有一个点在19*19的平面上运动&#xff0c;运动轨迹为 一共移动了90步&#xff0c;顺序为 y x y x y x 0 17 16 30 10 8 60 15 15 1 3 6 31 10 7 61 14 15 2 12 17 32 9 9 62 16 15 3 4 12 33 10 9 63 18 15 4 3 18 34 15 12 6…

供应链系统设计-供应链中台系统设计(十)- 清结算中心概念片篇

综述 我们之前在供应链系统设计-中台系统设计系列&#xff08;五&#xff09;- 供应链中台实践概述文章中针对中台到底是什么进行了描述&#xff0c;对于中台的范围也进行划分&#xff0c;如下图所示&#xff1a; 关于商品中心&#xff0c;我们之前用4篇文章介绍了什么是商品中…

C27.【C++ Cont】时间、空间限制和STL库的简单了解

&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;春节篇&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8; 目录 1.竞赛中的…

指针的介绍3后

1.函数指针变量 1.1函数的地址 void test(int (*arr)[2]) {printf("zl_dfq\n"); } int main() {printf("%p\n", test);printf("%p\n", &test);return 0; } 由上面的程序运行可知&#xff1a; 函数名就是函数的地址 &函数名也可以拿到函…

春晚舞台上的人形机器人:科技与文化的奇妙融合

文章目录 人形机器人Unitree H1的“硬核”实力传统文化与现代科技的创新融合网友热议与文化共鸣未来展望&#xff1a;科技与文化的更多可能结语 2025 年央视春晚的舞台&#xff0c;无疑是全球华人目光聚焦的焦点。就在这个盛大的舞台上&#xff0c;一场名为《秧BOT》的创意融合…

消息队列篇--通信协议篇--应用层协议和传输层协议理解

在网络通信中&#xff0c;传输层协议和应用层协议是OSI模型中的两个不同层次的协议&#xff0c;它们各自承担着不同的职责。 下文中&#xff0c;我们以TCP/UDP&#xff08;传输层协议&#xff09;和HTTP/SMTP&#xff08;应用层协议&#xff09;为例进行详细解释。 1、传输层协…

Linux - 进程间通信(2)

目录 2、进程池 1&#xff09;理解进程池 2&#xff09;进程池的实现 整体框架&#xff1a; a. 加载任务 b. 先描述&#xff0c;再组织 I. 先描述 II. 再组织 c. 创建信道和子进程 d. 通过channel控制子进程 e. 回收管道和子进程 问题1&#xff1a; 解答1&#xff…

基于Django的豆瓣影视剧推荐系统的设计与实现

【Django】基于Django的豆瓣影视剧推荐系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统采用了Python作为后端开发语言&#xff0c;采用Django作为后端架构&#xff0c;结…

【Rust自学】15.7. 循环引用导致内存泄漏

说句题外话&#xff0c;这篇文章真心很难&#xff0c;有看不懂可以在评论区问&#xff0c;我会尽快作答的。 喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω…

Blazor-Blazor Web App项目结构

让我们还是从创建项目开始&#xff0c;来一起了解下Blazor Web App的项目情况 创建项目 呈现方式 这里我们可以看到需要选择项目的呈现方式&#xff0c;有以上四种呈现方式 ● WebAssembly ● Server ● Auto(Server and WebAssembly) ● None 纯静态界面静态SSR呈现方式 WebAs…

登录授权流程

发起一个网络请求需要&#xff1a;1.请求地址 2.请求方式 3.请求参数 在检查中找到request method&#xff0c;在postman中设置同样的请求方式将登录的url接口复制到postman中&#xff08;json类型数据&#xff09;在payload中选择view parsed&#xff0c;将其填入Body-raw中 …

【硬件介绍】三极管工作原理(图文+典型电路设计)

什么是三极管&#xff1f; 三极管&#xff0c;全称为双极型晶体三极管&#xff0c;是一种广泛应用于电子电路中的半导体器件。它是由三个掺杂不同的半导体材料区域组成的&#xff0c;这三个区域分别是发射极&#xff08;E&#xff09;、基极&#xff08;B&#xff09;和集电极&…

51单片机开发:串口通信

实验目标&#xff1a;电脑通过串口将数据发送给51单片机&#xff0c;单片机原封不动地将数据通过串口返送给电脑。 串口的内部结构如下图所示&#xff1a; 串口配置如下&#xff1a; TMOD | 0X20 ; //设置计数器工作方式 2 SCON 0X50 ; //设置为工作方式 1 PCON 0X80 ; …

DeepSeek-R1本地部署笔记

文章目录 效果概要下载 ollama终端下载模型【可选】浏览器插件 UIQ: 内存占用高&#xff0c;显存占用不高&#xff0c;正常吗 效果 我的配置如下 E5 2666 V3 AMD 590Gme 可以说是慢的一批了&#xff0c;内存和显卡都太垃圾了&#xff0c;回去用我的新设备再试试 概要 安装…

【愚公系列】《循序渐进Vue.js 3.x前端开发实践》029-组件的数据注入

标题详情作者简介愚公搬代码头衔华为云特约编辑&#xff0c;华为云云享专家&#xff0c;华为开发者专家&#xff0c;华为产品云测专家&#xff0c;CSDN博客专家&#xff0c;CSDN商业化专家&#xff0c;阿里云专家博主&#xff0c;阿里云签约作者&#xff0c;腾讯云优秀博主&…

deepseek-r1 本地部署

deepseek 最近太火了 1&#xff1a;环境 win10 cpu 6c 内存 16G 2: 部署 1>首先下载ollama 官网&#xff1a;https://ollama.com ollama 安装在c盘 模型可以配置下载到其他盘 OLLAMA_MODELS D:\Ollama 2>下载模型并运行 ollama run deepseek-r1:<标签> 1.5b 7b 8…

租赁系统为企业资产管理提供高效解决方案促进业务增长与创新

内容概要 在现代商业环境中&#xff0c;企业不断寻求高效的管理解决方案&#xff0c;以提高运营效率、降低成本并推动业务增长。而租赁系统正是一款理想的工具&#xff0c;能够帮助企业实现这一目标。 快鲸智慧园区(楼宇)管理系统作为数字化资产管理的领先选择&#xff0c;提供…

Direct2D 极速教程(2) —— 画淳平

极速导航 创建新项目&#xff1a;002-DrawJunpeiWIC 是什么用 WIC 加载图片画淳平 创建新项目&#xff1a;002-DrawJunpei 右键解决方案 -> 添加 -> 新建项目 选择"空项目"&#xff0c;项目名称为 “002-DrawJunpei”&#xff0c;然后按"创建" 将 “…

自然语言处理——从原理、经典模型到应用

1. 概述 自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;是一门借助计算机技术研究人类语言的科学&#xff0c;是人工智能领域的一个分支&#xff0c;旨在让计算机理解、生成和处理人类语言。其核心任务是将非结构化的自然语言转换为机器可以…

【2025年数学建模美赛F题】(顶刊论文绘图)模型代码+论文

全球网络犯罪与网络安全政策的多维度分析及效能评估 摘要1 Introduction1.1 Problem Background1.2Restatement of the Problem1.3 Literature Review1.4 Our Work 2 Assumptions and Justifications数据完整性与可靠性假设&#xff1a;法律政策独立性假设&#xff1a;人口统计…