Merge pull request 'feat: 支持外部加载音频文件,优化打包配置' (#2) from main into master
Reviewed-on: http://192.168.3.32:3000/xiaji/countdown/pulls/2
This commit was merged in pull request #2.
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -7,7 +7,6 @@ __pycache__/
|
|||||||
build/
|
build/
|
||||||
dist/
|
dist/
|
||||||
*.spec
|
*.spec
|
||||||
!dist/*.exe
|
|
||||||
|
|
||||||
# IDE
|
# IDE
|
||||||
.idea/
|
.idea/
|
||||||
|
|||||||
BIN
2alarm.wav
Normal file
BIN
2alarm.wav
Normal file
Binary file not shown.
130
README.md
130
README.md
@@ -1,65 +1,65 @@
|
|||||||
# 述职计时器
|
# 述职计时器
|
||||||
|
|
||||||
一个使用 PySide6 构建的倒计时应用程序,美观大方,支持多种倒计时模式。
|
一个使用 PySide6 构建的倒计时应用程序,美观大方,支持多种倒计时模式。
|
||||||
|
|
||||||
## 功能特点
|
## 功能特点
|
||||||
|
|
||||||
### 界面状态
|
### 界面状态
|
||||||
程序有两种界面状态:
|
程序有两种界面状态:
|
||||||
|
|
||||||
#### 1. 正常状态
|
#### 1. 正常状态
|
||||||
- 显示倒计时时间和完整的按钮区域
|
- 显示倒计时时间和完整的按钮区域
|
||||||
- 可以通过拖动窗口的任何位置来移动窗口
|
- 可以通过拖动窗口的任何位置来移动窗口
|
||||||
- 显示按钮区域
|
- 显示按钮区域
|
||||||
- 窗口大小:500×300像素
|
- 窗口大小:500×300像素
|
||||||
|
|
||||||
#### 2. 微缩状态
|
#### 2. 微缩状态
|
||||||
- 点击"5分钟"或"6分钟"按钮开始倒计时后,延迟2秒自动切换到微缩状态
|
- 点击"5分钟"或"6分钟"按钮开始倒计时后,延迟2秒自动切换到微缩状态
|
||||||
- 只显示倒计时时间
|
- 只显示倒计时时间
|
||||||
- 窗口大小:200×80像素
|
- 窗口大小:200×80像素
|
||||||
- 位置:距离屏幕上边缘50像素,距离右边缘200像素
|
- 位置:距离屏幕上边缘50像素,距离右边缘200像素
|
||||||
- 双击界面后暂停倒计时,并切换回正常状态
|
- 双击界面后暂停倒计时,并切换回正常状态
|
||||||
|
|
||||||
### 快捷按钮
|
### 快捷按钮
|
||||||
- **5分钟**:开始5分钟倒计时
|
- **5分钟**:开始5分钟倒计时
|
||||||
- **6分钟**:开始6分钟倒计时
|
- **6分钟**:开始6分钟倒计时
|
||||||
- **其它**:打开配置对话框
|
- **其它**:打开配置对话框
|
||||||
|
|
||||||
### 配置功能
|
### 配置功能
|
||||||
点击"其它"按钮可以打开配置对话框:
|
点击"其它"按钮可以打开配置对话框:
|
||||||
- **自定义倒计时**:设置自定义倒计时时间(秒)
|
- **自定义倒计时**:设置自定义倒计时时间(秒)
|
||||||
- **提前告警**:设置倒计时结束前多少秒播放告警提示音,默认30秒
|
- **提前告警**:设置倒计时结束前多少秒播放告警提示音,默认30秒
|
||||||
- **窗口置顶**:设置窗口是否置顶
|
- **窗口置顶**:设置窗口是否置顶
|
||||||
- **窗口透明度**:设置窗口透明度(10%-100%)
|
- **窗口透明度**:设置窗口透明度(10%-100%)
|
||||||
- **测试告警**:测试告警提示音
|
- **测试告警**:测试告警提示音
|
||||||
- **退出**:退出程序(唯一退出方式)
|
- **退出**:退出程序(唯一退出方式)
|
||||||
|
|
||||||
### 告警功能
|
### 告警功能
|
||||||
- 倒计时结束前设置的秒数时播放告警提示音
|
- 倒计时结束前设置的秒数时播放告警提示音
|
||||||
- 循环播放3次
|
- 循环播放3次
|
||||||
- 倒计时结束时显示"时间已到"文字,带有跳动和闪动效果
|
- 倒计时结束时显示"时间已到"文字,带有跳动和闪动效果
|
||||||
|
|
||||||
## 使用说明
|
## 使用说明
|
||||||
|
|
||||||
1. 运行程序后,默认显示正常状态
|
1. 运行程序后,默认显示正常状态
|
||||||
2. 点击"5分钟"或"6分钟"按钮开始倒计时
|
2. 点击"5分钟"或"6分钟"按钮开始倒计时
|
||||||
3. 2秒后自动切换到微缩状态,只显示时间
|
3. 2秒后自动切换到微缩状态,只显示时间
|
||||||
4. 在微缩状态下双击可以暂停并回到正常状态
|
4. 在微缩状态下双击可以暂停并回到正常状态
|
||||||
5. 需要退出程序时,点击"其它"→"退出"
|
5. 需要退出程序时,点击"其它"→"退出"
|
||||||
|
|
||||||
## 技术栈
|
## 技术栈
|
||||||
- Python 3.11
|
- Python 3.11
|
||||||
- PySide6 (Qt 6)
|
- PySide6 (Qt 6)
|
||||||
- PyInstaller(打包)
|
- PyInstaller(打包)
|
||||||
|
|
||||||
## 打包命令
|
## 打包命令
|
||||||
```bash
|
```bash
|
||||||
python -m PyInstaller --onefile --windowed --icon=Timer.ico --name=述职计时器 countdown.py
|
python -m PyInstaller --onefile --windowed --icon=Timer.ico --name=述职计时器 countdown.py
|
||||||
```
|
```
|
||||||
|
|
||||||
## 文件说明
|
## 文件说明
|
||||||
- `countdown.py` - 主程序代码
|
- `countdown.py` - 主程序代码
|
||||||
- `Timer.ico` - 程序图标
|
- `Timer.ico` - 程序图标
|
||||||
- `要求.txt` - 功能需求文档
|
- `要求.txt` - 功能需求文档
|
||||||
- `clean.py` - 清理打包残留文件
|
- `clean.py` - 清理打包残留文件
|
||||||
- `SKILL.md` - 打包技巧说明
|
- `SKILL.md` - 打包技巧说明
|
||||||
|
|||||||
13
SKILL.md
Normal file
13
SKILL.md
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
## 元数据
|
||||||
|
name: pyinstaller个性化打包
|
||||||
|
description: 打包的时候,要求生成为一个exe文件,使用ico等等
|
||||||
|
|
||||||
|
## 概述
|
||||||
|
此 Skill 用于给有GUI界面的python代码,打包的时候,生成一个统一的要求:生成一个exe文件,去掉控制台窗口,使用本目录下的ico文件作为程序的图标。打包时,如果之前有打包过的文件(dist/build 文件夹),自动覆盖旧文件,不用手动确认,一键打包到底。
|
||||||
|
|
||||||
|
## 打包命令示例
|
||||||
|
python -m PyInstaller --onefile --windowed --icon=图标文件名.ico --name=guba-indicator --exclude-module PyQt5 --exclude-module PyQt5.QtCore --exclude-module PyQt5.QtGui --exclude-module PyQt5.QtWidgets --exclude-module PyQt6 --exclude-module PyQt6.QtCore --exclude-module PyQt6.QtGui --exclude-module PyQt6.QtWidgets python程序名.py
|
||||||
|
|
||||||
|
|
||||||
|
## 清除多余文件
|
||||||
|
在windows环境下,执行clean.py
|
||||||
17
clean.py
Normal file
17
clean.py
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
import glob
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
# 2. 清理打包残留文件 等价:rd /s /q build + del /f *.spec
|
||||||
|
print("开始清理打包残留文件...")
|
||||||
|
# 删除build文件夹
|
||||||
|
if os.path.exists("build") and os.path.isdir("build"):
|
||||||
|
shutil.rmtree("build")
|
||||||
|
# 删除所有.spec文件
|
||||||
|
spec_files = glob.glob("*.spec")
|
||||||
|
for spec_file in spec_files:
|
||||||
|
if os.path.exists(spec_file):
|
||||||
|
os.remove(spec_file)
|
||||||
|
|
||||||
|
print("✅ 打包完成 + 残留文件清理完毕!exe文件已生成在当前目录")
|
||||||
BIN
countdown.exe
BIN
countdown.exe
Binary file not shown.
30
countdown.py
30
countdown.py
@@ -17,6 +17,18 @@ class ConfigDialog(QDialog):
|
|||||||
self.init_ui()
|
self.init_ui()
|
||||||
|
|
||||||
def init_ui(self):
|
def init_ui(self):
|
||||||
|
self.setStyleSheet("""
|
||||||
|
QDialog {
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
}
|
||||||
|
QLabel {
|
||||||
|
color: #333333;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
QSpinBox, QCheckBox {
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
""")
|
||||||
layout = QFormLayout(self)
|
layout = QFormLayout(self)
|
||||||
|
|
||||||
# 自定义倒计时
|
# 自定义倒计时
|
||||||
@@ -181,11 +193,23 @@ class TimerApp(QWidget):
|
|||||||
|
|
||||||
def setup_audio(self):
|
def setup_audio(self):
|
||||||
self.sound = QSoundEffect()
|
self.sound = QSoundEffect()
|
||||||
|
|
||||||
|
# 优先从外部目录加载音频文件
|
||||||
if getattr(sys, 'frozen', False):
|
if getattr(sys, 'frozen', False):
|
||||||
base_path = sys._MEIPASS
|
# exe所在目录
|
||||||
|
external_path = os.path.dirname(sys.executable)
|
||||||
else:
|
else:
|
||||||
base_path = os.path.dirname(__file__)
|
# 当前工作目录
|
||||||
alarm_file = os.path.join(base_path, "alarm.wav")
|
external_path = os.getcwd()
|
||||||
|
|
||||||
|
alarm_file = os.path.join(external_path, "alarm.wav")
|
||||||
|
if not os.path.exists(alarm_file):
|
||||||
|
# 外部没有则从打包的临时目录加载
|
||||||
|
if getattr(sys, 'frozen', False):
|
||||||
|
alarm_file = os.path.join(sys._MEIPASS, "alarm.wav")
|
||||||
|
else:
|
||||||
|
alarm_file = os.path.join(os.path.dirname(__file__), "alarm.wav")
|
||||||
|
|
||||||
if os.path.exists(alarm_file):
|
if os.path.exists(alarm_file):
|
||||||
self.sound.setSource(QUrl.fromLocalFile(alarm_file))
|
self.sound.setSource(QUrl.fromLocalFile(alarm_file))
|
||||||
self.sound.setLoopCount(3)
|
self.sound.setLoopCount(3)
|
||||||
|
|||||||
34
要求.txt
34
要求.txt
@@ -1,18 +1,18 @@
|
|||||||
目的:写一个python语言的,pyside6库作为界面的应用程序。
|
目的:写一个python语言的,pyside6库作为界面的应用程序。
|
||||||
功能:倒计时显示和提醒。
|
功能:倒计时显示和提醒。
|
||||||
界面需求:整体要美观大方。
|
界面需求:整体要美观大方。
|
||||||
1. 窗口无标题栏,可以通过点击并拖动任何位置移动窗口
|
1. 窗口无标题栏,可以通过点击并拖动任何位置移动窗口
|
||||||
2. 倒计时显示区域:显示分和秒的倒计时,字体大且醒目
|
2. 倒计时显示区域:显示分和秒的倒计时,字体大且醒目
|
||||||
3. 界面分为2个状态:
|
3. 界面分为2个状态:
|
||||||
a. 正常状态:显示时间,点击箭头,显示按钮区域,再点击箭头,按钮区域折叠
|
a. 正常状态:显示时间,点击箭头,显示按钮区域,再点击箭头,按钮区域折叠
|
||||||
b. 微缩状态:点击"5分钟"后,延迟2秒,界面改为微缩状态,只有时间区域和向下箭头
|
b. 微缩状态:点击"5分钟"后,延迟2秒,界面改为微缩状态,只有时间区域和向下箭头
|
||||||
4. 微缩状态详情:
|
4. 微缩状态详情:
|
||||||
- 窗口长为200px,高为60px
|
- 窗口长为200px,高为60px
|
||||||
- 距离top为50px,距离屏幕右边留出空白200px的距离
|
- 距离top为50px,距离屏幕右边留出空白200px的距离
|
||||||
- 点击向下箭头,回到正常状态的位置和大小
|
- 点击向下箭头,回到正常状态的位置和大小
|
||||||
5. 快捷按钮:第一个按钮是"5分钟",第二个按钮是"6分钟",第三个按钮是"其它"
|
5. 快捷按钮:第一个按钮是"5分钟",第二个按钮是"6分钟",第三个按钮是"其它"
|
||||||
6. 其它按钮功能:打开配置页面,可以设置自定义倒计时时间、提前告警时间、窗口置顶选项、透明度设置
|
6. 其它按钮功能:打开配置页面,可以设置自定义倒计时时间、提前告警时间、窗口置顶选项、透明度设置
|
||||||
7. 告警功能:倒计时结束前设置的秒数时播放告警提示音,循环3次
|
7. 告警功能:倒计时结束前设置的秒数时播放告警提示音,循环3次
|
||||||
8. 倒计时结束后:显示"时间已到"文字,带有跳动和闪动效果
|
8. 倒计时结束后:显示"时间已到"文字,带有跳动和闪动效果
|
||||||
9. 配置对话框:增加退出按钮,只有通过此按钮才能退出程序
|
9. 配置对话框:增加退出按钮,只有通过此按钮才能退出程序
|
||||||
10. 测试要求:使用pyqt-test库作为gui程序的测试工具。
|
10. 测试要求:使用pyqt-test库作为gui程序的测试工具。
|
||||||
Reference in New Issue
Block a user