Python项目——久坐提醒定时器(PySide6)编写

1、介绍

  • 使用Python编写一个久坐提醒软件。
  • 功能:
    • 设置工作时间。
    • 设置休息时间。
    • 选择休息时是否播放音乐。
    • 休息时,软件置顶,且不能关闭。

2、工具

  • 语言:python3.11
  • UI设计工具:Qt designer
  • 编译器:PyCharm
  • 包:pygame、PySide6

3、代码

  • 新建一个项目,准备好音乐。
  • 使用Qt designer设计一个UI界面,保存ui文件,再转换为py文件并保存到项目目录中,供后续使用。
  • 具体方法:Pyside6入门教学——编写一个UI界面并显示-CSDN博客
  • 转换后的py文件如下:
    • # -*- coding: utf-8 -*-
      ################################################################################
      ## Form generated from reading UI file 'SedentaryReminder.ui'
      ##
      ## Created by: Qt User Interface Compiler version 6.6.1
      ##
      ## WARNING! All changes made in this file will be lost when recompiling UI file!
      ################################################################################
      
      from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
          QMetaObject, QObject, QPoint, QRect,
          QSize, QTime, QUrl, Qt)
      from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
          QFont, QFontDatabase, QGradient, QIcon,
          QImage, QKeySequence, QLinearGradient, QPainter,
          QPalette, QPixmap, QRadialGradient, QTransform)
      from PySide6.QtWidgets import (QApplication, QCheckBox, QHBoxLayout, QLCDNumber,
          QLabel, QMainWindow, QPushButton, QSizePolicy,
          QSpinBox, QSplitter, QWidget)
      
      class Ui_MainWindow(object):
          def setupUi(self, MainWindow):
              if not MainWindow.objectName():
                  MainWindow.setObjectName(u"MainWindow")
              MainWindow.resize(260, 300)
              MainWindow.setMinimumSize(QSize(260, 300))
              MainWindow.setMaximumSize(QSize(260, 300))
              self.centralwidget = QWidget(MainWindow)
              self.centralwidget.setObjectName(u"centralwidget")
              self.label_2 = QLabel(self.centralwidget)
              self.label_2.setObjectName(u"label_2")
              self.label_2.setGeometry(QRect(37, 143, 48, 20))
              font = QFont()
              font.setPointSize(12)
              font.setBold(True)
              self.label_2.setFont(font)
              self.label = QLabel(self.centralwidget)
              self.label.setObjectName(u"label")
              self.label.setGeometry(QRect(31, 21, 64, 20))
              self.label.setFont(font)
              self.label.setMouseTracking(True)
              self.ifLock = QCheckBox(self.centralwidget)
              self.ifLock.setObjectName(u"ifLock")
              self.ifLock.setGeometry(QRect(70, 169, 121, 20))
              self.ifLock.setMouseTracking(True)
              self.ok = QPushButton(self.centralwidget)
              self.ok.setObjectName(u"ok")
              self.ok.setGeometry(QRect(90, 200, 71, 23))
              self.splitter = QSplitter(self.centralwidget)
              self.splitter.setObjectName(u"splitter")
              self.splitter.setGeometry(QRect(61, 50, 161, 21))
              self.splitter.setOrientation(Qt.Horizontal)
              self.label_3 = QLabel(self.splitter)
              self.label_3.setObjectName(u"label_3")
              self.splitter.addWidget(self.label_3)
              self.workTime = QSpinBox(self.splitter)
              self.workTime.setObjectName(u"workTime")
              self.splitter.addWidget(self.workTime)
              self.label_5 = QLabel(self.splitter)
              self.label_5.setObjectName(u"label_5")
              self.splitter.addWidget(self.label_5)
              self.splitter_2 = QSplitter(self.centralwidget)
              self.splitter_2.setObjectName(u"splitter_2")
              self.splitter_2.setGeometry(QRect(61, 79, 161, 21))
              self.splitter_2.setOrientation(Qt.Horizontal)
              self.label_4 = QLabel(self.splitter_2)
              self.label_4.setObjectName(u"label_4")
              self.splitter_2.addWidget(self.label_4)
              self.restTime = QSpinBox(self.splitter_2)
              self.restTime.setObjectName(u"restTime")
              self.splitter_2.addWidget(self.restTime)
              self.label_6 = QLabel(self.splitter_2)
              self.label_6.setObjectName(u"label_6")
              self.splitter_2.addWidget(self.label_6)
              self.widget = QWidget(self.centralwidget)
              self.widget.setObjectName(u"widget")
              self.widget.setGeometry(QRect(60, 239, 126, 36))
              self.horizontalLayout = QHBoxLayout(self.widget)
              self.horizontalLayout.setObjectName(u"horizontalLayout")
              self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
              self.label_7 = QLabel(self.widget)
              self.label_7.setObjectName(u"label_7")
              font1 = QFont()
              font1.setPointSize(18)
              font1.setBold(True)
              self.label_7.setFont(font1)
      
              self.horizontalLayout.addWidget(self.label_7)
      
              self.time = QLCDNumber(self.widget)
              self.time.setObjectName(u"time")
      
              self.horizontalLayout.addWidget(self.time)
      
              MainWindow.setCentralWidget(self.centralwidget)
      
              self.retranslateUi(MainWindow)
      
              QMetaObject.connectSlotsByName(MainWindow)
          # setupUi
      
          def retranslateUi(self, MainWindow):
              MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"\u4e45\u5750\u63d0\u9192", None))
              self.label_2.setText(QCoreApplication.translate("MainWindow", u"\u9009\u9879\uff1a", None))
              self.label.setText(QCoreApplication.translate("MainWindow", u"\u8ba1\u65f6\u5668\uff1a", None))
              self.ifLock.setText(QCoreApplication.translate("MainWindow", u"\u4f11\u606f\u65f6\u64ad\u653e\u97f3\u4e50", None))
              self.ok.setText(QCoreApplication.translate("MainWindow", u"\u5f00\u59cb", None))
              self.label_3.setText(QCoreApplication.translate("MainWindow", u"\u5de5\u4f5c\u65f6\u95f4\uff1a", None))
              self.label_5.setText(QCoreApplication.translate("MainWindow", u"\uff08\u5206\u949f\uff09", None))
              self.label_4.setText(QCoreApplication.translate("MainWindow", u"\u4f11\u606f\u65f6\u95f4\uff1a", None))
              self.label_6.setText(QCoreApplication.translate("MainWindow", u"\uff08\u5206\u949f\uff09", None))
              self.label_7.setText(QCoreApplication.translate("MainWindow", u"\u5de5\u4f5c", None))
          # retranslateUi
  • 编写main.c文件。
    • import sys
      from PySide6.QtWidgets import QApplication, QMainWindow, QLCDNumber
      from ui_SedentaryReminder import Ui_MainWindow
      from PySide6.QtCore import QTimer, Qt, QCoreApplication
      import pygame
      
      
      class MainWindow(QMainWindow):
          def __init__(self):
              super(MainWindow, self).__init__()
              self.ui = Ui_MainWindow()  # UI类的实例化
              self.ui.setupUi(self)
              # 初始时间
              self.workTime = 60
              self.restTime = 5
              self.total_seconds = self.workTime * 60
              self.ui.workTime.setValue(self.workTime)  # 初始工作时间
              self.ui.restTime.setValue(self.restTime)  # 初始休息时间
              # 音乐地址
              self.musicFilePath = "./music/music.mp3"
              # 初始化倒计时显示
              self.ui.time.setSegmentStyle(QLCDNumber.Filled)
              self.ui.time.setDigitCount(5)  # 显示5位
              self.ui.time.display("00:00")
              # 实例化时间控件
              self.timer = QTimer(self)
              self.timer.setInterval(1000)
              # 初始化pygame
              pygame.init()
              pygame.mixer.init()
              # 点击确定开始运行
              self.ui.ok.clicked.connect(self.setTime)
      
          # 设置工作时间
          def setTime(self):
              self.workTime = int(self.ui.workTime.text())
              self.restTime = int(self.ui.restTime.text())
              self.total_seconds = self.workTime * 60
              if not self.timer.isActive():
                  self.timer.start()
                  self.timer.timeout.connect(self.countdownWork)
      
          # 设置工作倒计时
          def countdownWork(self):
              # 工作倒计时
              if self.total_seconds > 0:
                  self.total_seconds -= 1
                  minutes, seconds = divmod(self.total_seconds, 60)
                  self.ui.time.display(f"{minutes:02d}:{seconds:02d}")
              else:
                  self.timer.stop()
                  self.timer.timeout.disconnect(self.countdownWork)
                  # 休息设置
                  self.total_seconds = self.restTime * 60
                  self.ui.label_7.setText('休息')
                  self.ui.ok.setDisabled(True)
                  self.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.FramelessWindowHint | Qt.Tool)  # 窗体置顶,无边框,在任务栏不显示图标
                  window.show()  # 重新显示
                  # 播放音乐
                  if self.ui.ifLock.isChecked():
                      pygame.mixer.music.load(self.musicFilePath)
                      pygame.mixer.music.play()
                  self.timer.start()  # 重新计时
                  self.timer.timeout.connect(self.countdownRest)
      
          # 设置休息倒计时
          def countdownRest(self):
              # 休息倒计时
              if self.total_seconds > 0:
                  self.total_seconds -= 1
                  minutes, seconds = divmod(self.total_seconds, 60)
                  self.ui.time.display(f"{minutes:02d}:{seconds:02d}")
              else:
                  self.setWindowFlags(Qt.Window)  # 重置窗口
                  window.show()  # 重新显示
                  self.total_seconds = self.workTime * 60
                  self.ui.label_7.setText('工作')
                  self.ui.ok.setDisabled(False)
                  self.timer.stop()
                  self.timer.timeout.disconnect(self.countdownRest)
                  # 关闭音乐
                  pygame.mixer.music.stop()
                  pygame.mixer.quit()
                  pygame.quit()
      
          def closeEvent(self, event):
              super(MainWindow, self).closeEvent(event)
              sys.exit(app.exec())
      
      
      if __name__ == '__main__':
          app = QApplication([])  # 启动一个应用
          window = MainWindow()  # 实例化主窗口
          window.show()  # 展示主窗口
          sys.exit(app.exec())  # 应用关闭时关闭进程

4、展示

  •  运行程序。
  • 设置工作时间和休息时间,勾选播放音乐,点击开始。倒计时开始...
  • 工作时间结束,播放音乐,开始休息倒计时。此时,窗口置顶,并且不能关闭,也不能点击开始。
  • 休息时间结束,恢复窗口。此时可以关闭,也可以重新开始计时。

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

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

相关文章

北斗卫星:助力社区矫正人员追踪与管理的科技突破

北斗卫星:助力社区矫正人员追踪与管理的科技突破 社区矫正人员是一个重要的社会群体,他们的安全和管理对于社会的和谐稳定至关重要。随着技术的飞跃发展,北斗卫星系统作为我国自主研发的卫星导航系统,正逐渐在社区矫正工作中发挥…

《世界之外》提前开测,网易打响国乙大战

1月18日,国乙市场迎来了一场大战。 原定于1月26日开服的网易新乙游《世界之外》,突然宣布在1月18日进行不删档、不限量测试,从某种意义上来说,其实就等同于提前公测。 而同一天开服的还有叠纸的全新3D乙游《恋与深空》&#xff…

比特币狂人引爆达沃斯论坛

点击查看TechubNews原文链接:比特币狂人引爆达沃斯论坛 比特币狂人、自称无政府资本主义者的阿根廷总统米莱在达沃斯的最新演讲引爆社交网络大讨论。 1 月 15 日,第 54 届世界经济论坛在瑞士阿尔卑斯山的达沃斯开幕。来自约 60 个国家首脑和跨国公司的领…

音乐人声分离工具:极简的人声和背景音乐分离工具

这是一个极简的人声和背景音乐分离工具,本地化网页操作,无需连接外网,使用 2stems/4stems/5stems 模型。 将一首歌曲或者含有背景音乐的音视频文件,拖拽到本地网页中,即可将其中的人声和音乐声分离为单独的音频wav文件…

编程笔记 html5cssjs 045 网页布局

编程笔记 html5&css&js 045 网页布局 一、网页布局二、头部区域三、菜单导航区域三、内容区域四、不相等的列五、底部区域六、box-sizingbox-sizing 属性可以被用来调整这些表现:属性值content-boxborder-box 六、响应式网页布局小结 网页布局有很多种方式&…

MySQL(视图,存储函数,存储过程)

作业1: 作业实现: 首先创建学生表,课程表,以及学生选课表。 CREATE TABLE Student (Sno INT PRIMARY KEY,Sname VARCHAR(20) NOT NULL,Ssex CHAR(1) CHECK (Ssex IN (男, 女)),Sage INT,SDept VARCHAR(20) DEFAULT 计算机 );CRE…

zabbix监控扩展

目录 一、zabbix自动发现与自动注册 (一)理论定义 1.自动发现 2.自动注册 (二)实操部署 1.自动发现 (1)新增一台客户端命名为zbx-agent02 ① 配置时间同步 ② 在服务端和客户端上配置 hosts 解析 …

枚举类型缝缝补补

✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:橘橙黄又青-CSDN博客 1.关键字enum的定义 enum是C语言中的一个关键字,enum叫枚举数据类型&#…

天津想转行学python培训班靠谱吗?

现在的职业如此繁多,很多人把高薪当成衡量工作好坏的重要标准,因此IT行业以超出其他行业几倍薪资水平成为不错的选择,而Python又以其简单易学好上手成为大家所青睐的学习目标。 Python发展前景如何 Python语言就业发展方向广泛:…

C-Lodop (Print)前端自定义打印控件

1.首先安装C-Lodop.exe软件&#xff0c;参考地址 Welcome to C-Lodop 2.软件下载地址 下载中心 - Lodop和C-Lodop官网主站 3.案列 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><script srchttp://19…

Nginx前后端分离部署springboot和vue项目

Nginx前后端分离部署springboot和vue项目&#xff0c;其实用的比较多&#xff0c;有的小伙伴对其原理和配置还一知半解&#xff0c;现在就科普一下&#xff1a; 1、准备后端项目 后端工程无论是微服务还是单体&#xff0c;一般最终都是jar启动&#xff0c;关键点就是把后端服…

谷达冠楠科技:抖音开网店新手小白可以卖的产品

随着互联网的发展&#xff0c;越来越多的人选择在网上开设自己的店铺。而抖音作为目前最火的短视频平台&#xff0c;也提供了开店的功能。那么&#xff0c;对于新手小白来说&#xff0c;抖音开网店可以卖哪些产品呢? 我们可以考虑的是服装类商品。抖音上有很多时尚博主&#x…

工厂企业消防安全AI可视化视频智能监管解决方案

一、方案背景 2023年11月20日下午6时30分许&#xff0c;位于江苏省无锡市惠山区前洲街道的某公司突发严重火灾&#xff0c;共造成7人死亡。这次火灾提醒我们工业安全至关重要&#xff0c;企业都应该时刻保持警惕&#xff0c;加强安全意识和培训&#xff0c;提高应对突发事件的…

【单片机】改写DS2431芯片的地址码,地址ROM,DS2431芯片解密

对DS2431里面的128字节可以进行任意读写&#xff0c;方式可以看这里&#xff1a;https://blog.csdn.net/x1131230123/article/details/132248958 但DS2431芯片的地址码是光刻不可修改的&#xff0c;所以只有使用模拟芯片。 原理&#xff1a; https://www.dianyuan.com/article…

“一键中日文件夹名转换 - 批量修改,轻松实现中文到日语的名称翻译“

在处理大量文件夹时&#xff0c;你是否曾为中日文件夹名称的转换而感到困扰&#xff1f;现在&#xff0c;有了我们的批量修改工具&#xff0c;这些烦恼全部消失&#xff01;只需简单几步&#xff0c;就能将中文名的文件夹名称翻译成日语&#xff0c;让你的文件管理更加高效。 …

搭建DHCP 服务

1. 确认yum 源 2. 安装DHCP 服务 3. 配置DHCP 服务&#xff0c;导入配置模板文件 管理DHCP 服务 配置yum 源 安装DHCP 服务 [rootlocalhost ~]# yum install dhcp -y ... Complete! [rootlocalhost ~]# 配置DHCP 服务 DHCP 配置文件路径。 [rootlocalhost ~]# cat /etc/dhcp/dh…

欧科云链与《警察技术》联合发布技术专题.pdf

欧科云链受《警察技术》邀请&#xff0c;于第201期期刊正式刊登“区块链生态安全与虚拟货币犯罪治理”技术专题。欧科云链作为该技术专题主要作者&#xff0c;直接参与本次期刊2篇文章撰写&#xff0c;同时为多篇文章提供欧科云链的最新数据和研究成果。 《警察技术》期刊创办于…

使用人工智能助手 Github Copilot 进行编程 01

本章涵盖了 AI 助⼿如何改变新程序员的学习⽅式为什么编程永远不会再⼀样了AI 助⼿如 Copilot 的⼯作原理Copilot 如何解决⼊⻔级编程问题AI 辅助编程的潜在危险 在本章中&#xff0c;我们将讨论人类如何与计算机进行交流。我们将向您介绍您的 AI 助手 GitHub Copilot&#x…

Excel2016随手记录-学生按照教学班区分出成绩表,形成独立教学班Excel表。

软件版本&#xff1a;Microsoft Office 标准版 2016 一、背景二、学生成绩按教学班区分成各个子表2.1.区分子表操作步骤2.2.优化调整表格式 三、教学班多个子表导出独立的表 ————————————————————————————————————————————————…

MySQL 删除ibdata1时怎么恢复

标题&#xff1a;MySQL InnoDB数据恢复&#xff0c;丢失ibdata1时怎么安全恢复 废话在前&#xff1a; 恭喜你&#xff0c;当你看到这篇文章的时候&#xff0c;说明有可能 你心里已经有一万匹&#x1f40e;在奔腾了。千万不要乱删除ibdata1&#xff0c;有些博客无脑抓取、复制…