Compare commits
1 Commits
branch-off
...
4e3763448b
| Author | SHA1 | Date | |
|---|---|---|---|
| 4e3763448b |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -7,6 +7,7 @@ __pycache__/
|
|||||||
build/
|
build/
|
||||||
dist/
|
dist/
|
||||||
*.spec
|
*.spec
|
||||||
|
!dist/*.exe
|
||||||
|
|
||||||
# IDE
|
# IDE
|
||||||
.idea/
|
.idea/
|
||||||
|
|||||||
BIN
2alarm.wav
BIN
2alarm.wav
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` - 打包技巧说明
|
||||||
|
|||||||
187
README(分支机构).md
187
README(分支机构).md
@@ -1,187 +0,0 @@
|
|||||||
# 述职计时器(分支机构版)
|
|
||||||
|
|
||||||
一个使用 PySide6 构建的倒计时应用程序,专为述职演讲设计,美观大方,支持多种倒计时模式。
|
|
||||||
|
|
||||||
## 最新更新
|
|
||||||
|
|
||||||
- **界面优化**:采用浅蓝色调设计,更加清新美观
|
|
||||||
- **按钮调整**:将原来的"5分钟"和"6分钟"按钮合并为"4分钟"按钮
|
|
||||||
- **位置优化**:微缩窗口默认距离右边缘40像素,距离上边缘30像素
|
|
||||||
- **焦点管理**:切换到微缩模式时自动将焦点还给上一个进程
|
|
||||||
|
|
||||||
## 功能特点
|
|
||||||
|
|
||||||
### 界面设计
|
|
||||||
- **浅蓝色调**:采用清新的浅蓝色(#e8f4f8)作为主色调
|
|
||||||
- **圆角设计**:15px圆角边框,美观大方
|
|
||||||
- **无标题栏**:可通过拖动窗口任意位置移动窗口
|
|
||||||
- **两种状态**:正常状态和微缩状态
|
|
||||||
|
|
||||||
### 界面状态
|
|
||||||
程序有两种界面状态:
|
|
||||||
|
|
||||||
#### 1. 正常状态
|
|
||||||
- 显示倒计时时间和完整的按钮区域
|
|
||||||
- 可以通过拖动窗口的任何位置来移动窗口
|
|
||||||
- 显示按钮区域:"4分钟"和"其它"按钮
|
|
||||||
- 窗口大小:500×300像素
|
|
||||||
|
|
||||||
#### 2. 微缩状态
|
|
||||||
- 点击"4分钟"按钮开始倒计时后,延迟2秒自动切换到微缩状态
|
|
||||||
- 只显示倒计时时间
|
|
||||||
- 窗口大小:120×50像素
|
|
||||||
- 位置:距离屏幕上边缘30像素,距离右边缘40像素(可配置)
|
|
||||||
- **焦点管理**:切换到微缩状态时自动将焦点还给上一个进程
|
|
||||||
- 双击界面后暂停倒计时,并切换回正常状态
|
|
||||||
|
|
||||||
### 快捷按钮
|
|
||||||
- **4分钟**:开始4分钟(240秒)倒计时
|
|
||||||
- **其它**:打开配置对话框
|
|
||||||
|
|
||||||
### 配置功能
|
|
||||||
点击"其它"按钮可以打开配置对话框:
|
|
||||||
|
|
||||||
| 配置项 | 说明 | 默认值 |
|
|
||||||
|--------|------|--------|
|
|
||||||
| 自定义秒数 | 设置自定义倒计时时间(1-3600秒) | 240秒 |
|
|
||||||
| 提前告警(秒) | 设置倒计时结束前多少秒播放告警提示音 | 30秒 |
|
|
||||||
| 窗口置顶 | 设置窗口是否置顶 | 开启 |
|
|
||||||
| 窗口透明度 | 设置窗口透明度(10%-100%) | 100% |
|
|
||||||
| 距离右边缘 | 微缩窗口距离屏幕右边缘的像素值 | 40像素 |
|
|
||||||
| 距离上边缘 | 微缩窗口距离屏幕上边缘的像素值 | 30像素 |
|
|
||||||
| 测试告警 | 测试告警提示音 | - |
|
|
||||||
| 退出程序 | 退出程序(唯一退出方式) | - |
|
|
||||||
|
|
||||||
### 告警功能
|
|
||||||
- **提前告警**:倒计时结束前设置的秒数时播放告警提示音
|
|
||||||
- **循环播放**:告警音循环播放3次
|
|
||||||
- **音量控制**:告警音音量设置为80%
|
|
||||||
- **倒计时结束效果**:
|
|
||||||
- 微缩模式:文字红黄闪烁效果
|
|
||||||
- 正常模式:文字跳动 + 透明度闪烁效果
|
|
||||||
|
|
||||||
### 音频支持
|
|
||||||
- 支持自定义告警音效
|
|
||||||
- 优先从外部目录加载 `alarm.wav` 音频文件
|
|
||||||
- 若外部未找到,则使用内置音频文件
|
|
||||||
|
|
||||||
### 焦点管理
|
|
||||||
- **智能焦点归还**:切换到微缩模式时自动将焦点还给上一个进程
|
|
||||||
- **窗口层级管理**:微缩窗口自动置于其他窗口下方
|
|
||||||
- **无干扰设计**:不影响用户在其他应用程序中的操作
|
|
||||||
|
|
||||||
## 使用说明
|
|
||||||
|
|
||||||
### 快速开始
|
|
||||||
1. 运行程序(双击 `countdown.exe` 或运行 `python countdown.py`)
|
|
||||||
2. 程序启动后显示正常状态界面
|
|
||||||
3. 点击"4分钟"按钮开始4分钟倒计时
|
|
||||||
4. 2秒后自动切换到微缩状态
|
|
||||||
5. 在微缩状态下双击可以暂停并回到正常状态
|
|
||||||
|
|
||||||
### 详细操作指南
|
|
||||||
|
|
||||||
#### 1. 启动程序
|
|
||||||
- 方法一:双击 `countdown.exe`(已打包版本)
|
|
||||||
- 方法二:运行 `python countdown.py`(源代码版本)
|
|
||||||
|
|
||||||
#### 2. 开始倒计时
|
|
||||||
- 点击"4分钟"按钮:开始4分钟倒计时
|
|
||||||
- 点击"其它"按钮 → 设置自定义时间 → 点击"开始倒计时":使用自定义时间
|
|
||||||
|
|
||||||
#### 3. 窗口操作
|
|
||||||
- **移动窗口**:在正常状态下,拖动窗口任意位置可移动窗口
|
|
||||||
- **切换状态**:开始倒计时后2秒自动切换到微缩状态
|
|
||||||
- **恢复状态**:在微缩状态下双击窗口可暂停倒计时并恢复为正常状态
|
|
||||||
|
|
||||||
#### 4. 配置设置
|
|
||||||
1. 点击"其它"按钮打开配置对话框
|
|
||||||
2. 根据需要调整各项配置:
|
|
||||||
- 设置自定义倒计时时间
|
|
||||||
- 调整提前告警时间
|
|
||||||
- 开启/关闭窗口置顶
|
|
||||||
- 调整窗口透明度
|
|
||||||
- 设置微缩窗口位置
|
|
||||||
3. 点击"确认并保存"应用设置
|
|
||||||
4. 点击"测试告警"测试告警音效
|
|
||||||
5. 点击"退出程序"退出应用程序
|
|
||||||
|
|
||||||
#### 5. 告警提示
|
|
||||||
- 倒计时结束前30秒(默认)会播放告警提示音
|
|
||||||
- 告警音循环播放3次
|
|
||||||
- 倒计时结束时显示"时间已到"并有视觉特效
|
|
||||||
|
|
||||||
### 音频配置
|
|
||||||
1. 准备一个 `alarm.wav` 音频文件
|
|
||||||
2. 将文件放置在以下位置之一:
|
|
||||||
- 与 `countdown.exe` 同一目录
|
|
||||||
- 当前工作目录
|
|
||||||
3. 程序会优先加载外部音频文件
|
|
||||||
|
|
||||||
## 技术栈
|
|
||||||
- **编程语言**:Python 3.11+
|
|
||||||
- **GUI框架**:PySide6 (Qt 6)
|
|
||||||
- **音频支持**:Qt Multimedia
|
|
||||||
- **打包工具**:PyInstaller
|
|
||||||
|
|
||||||
## 打包命令
|
|
||||||
```bash
|
|
||||||
python -m PyInstaller --onefile --windowed --icon=Timer.ico --name=述职计时器 countdown.py
|
|
||||||
```
|
|
||||||
|
|
||||||
## 文件说明
|
|
||||||
| 文件 | 说明 |
|
|
||||||
|------|------|
|
|
||||||
| `countdown.py` | 主程序源代码 |
|
|
||||||
| `Timer.ico` | 程序图标文件 |
|
|
||||||
| `alarm.wav` | 默认告警音频文件 |
|
|
||||||
| `2alarm.wav` | 备用告警音频文件 |
|
|
||||||
| `README.md` | 原始说明文档 |
|
|
||||||
| `README(分支机构).md` | 分支机构版说明文档(本文档) |
|
|
||||||
| `操作手册.md` | 详细操作手册 |
|
|
||||||
| `要求.txt` | 功能需求文档 |
|
|
||||||
| `clean.py` | 清理打包残留文件 |
|
|
||||||
| `SKILL.md` | 打包技巧说明 |
|
|
||||||
|
|
||||||
## 开发说明
|
|
||||||
|
|
||||||
### 代码结构
|
|
||||||
- `TimerApp` 类:主应用程序类
|
|
||||||
- `ConfigDialog` 类:配置对话框类
|
|
||||||
- 主要方法:
|
|
||||||
- `init_ui()`:初始化用户界面
|
|
||||||
- `start_countdown()`:开始倒计时
|
|
||||||
- `set_mini_state()`:切换到微缩状态
|
|
||||||
- `return_focus_to_previous_window()`:焦点归还功能
|
|
||||||
- `open_config()`:打开配置对话框
|
|
||||||
|
|
||||||
### 关键特性实现
|
|
||||||
1. **无标题栏窗口**:使用 `Qt.FramelessWindowHint`
|
|
||||||
2. **窗口拖动**:重写 `mousePressEvent` 和 `mouseMoveEvent`
|
|
||||||
3. **微缩状态**:定时器控制状态切换
|
|
||||||
4. **焦点管理**:使用 `clearFocus()`、`lower()` 和 `requestActivate()`
|
|
||||||
5. **音频播放**:使用 `QSoundEffect` 播放告警音
|
|
||||||
|
|
||||||
### 自定义修改
|
|
||||||
如需自定义程序,可修改以下部分:
|
|
||||||
- 界面颜色:修改 `setStyleSheet` 中的颜色值
|
|
||||||
- 按钮时间:修改 `start_countdown` 中的时间参数
|
|
||||||
- 窗口位置:修改 `config` 字典中的 `right_margin` 和 `top_margin`
|
|
||||||
- 音频文件:替换 `alarm.wav` 文件
|
|
||||||
|
|
||||||
## 注意事项
|
|
||||||
1. 首次运行请确保 `alarm.wav` 与可执行文件在同一目录
|
|
||||||
2. 微缩窗口位置可在配置中自定义调整
|
|
||||||
3. 程序退出必须通过配置对话框中的"退出程序"按钮
|
|
||||||
4. 焦点归还功能仅在切换到微缩状态时生效
|
|
||||||
5. 窗口置顶功能可能在某些系统上表现不同
|
|
||||||
|
|
||||||
## 版本历史
|
|
||||||
- **v1.0**:基础版本,支持5分钟和6分钟倒计时
|
|
||||||
- **v1.1**:界面优化,改为浅蓝色调
|
|
||||||
- **v1.2**:按钮调整,合并为4分钟按钮
|
|
||||||
- **v1.3**:位置优化,微缩窗口位置调整
|
|
||||||
- **v1.4**:焦点管理,自动归还焦点功能
|
|
||||||
|
|
||||||
## 支持与反馈
|
|
||||||
如有问题或建议,请参考源代码进行调试或联系开发人员。
|
|
||||||
13
SKILL.md
13
SKILL.md
@@ -1,13 +0,0 @@
|
|||||||
## 元数据
|
|
||||||
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
17
clean.py
@@ -1,17 +0,0 @@
|
|||||||
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.
78
countdown.py
78
countdown.py
@@ -17,18 +17,6 @@ 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)
|
||||||
|
|
||||||
# 自定义倒计时
|
# 自定义倒计时
|
||||||
@@ -107,12 +95,12 @@ class TimerApp(QWidget):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.config = {
|
self.config = {
|
||||||
'duration': 240,
|
'duration': 300,
|
||||||
'alarm_offset': 30,
|
'alarm_offset': 30,
|
||||||
'stay_on_top': True,
|
'stay_on_top': True,
|
||||||
'opacity': 1.0,
|
'opacity': 1.0,
|
||||||
'right_margin': 40, # 距离右边缘
|
'right_margin': 200, # 距离右边缘
|
||||||
'top_margin': 30 # 距离上边缘
|
'top_margin': 50 # 距离上边缘
|
||||||
}
|
}
|
||||||
self.remaining_time = 0
|
self.remaining_time = 0
|
||||||
self.is_running = False
|
self.is_running = False
|
||||||
@@ -129,19 +117,19 @@ class TimerApp(QWidget):
|
|||||||
self.setAttribute(Qt.WA_TranslucentBackground)
|
self.setAttribute(Qt.WA_TranslucentBackground)
|
||||||
self.setStyleSheet("""
|
self.setStyleSheet("""
|
||||||
QWidget#MainFrame {
|
QWidget#MainFrame {
|
||||||
background-color: #e8f4f8;
|
background-color: #2c3e50;
|
||||||
border-radius: 15px;
|
border-radius: 15px;
|
||||||
border: 2px solid #b0d4e3;
|
border: 2px solid #34495e;
|
||||||
}
|
}
|
||||||
QLabel { color: #2c3e50; font-family: 'Segoe UI', Arial; }
|
QLabel { color: #ecf0f1; font-family: 'Segoe UI', Arial; }
|
||||||
QPushButton {
|
QPushButton {
|
||||||
background-color: #5dade2;
|
background-color: #3498db;
|
||||||
color: white;
|
color: white;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
padding: 8px;
|
padding: 8px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
QPushButton:hover { background-color: #3498db; }
|
QPushButton:hover { background-color: #2980b9; }
|
||||||
""")
|
""")
|
||||||
|
|
||||||
self.main_layout = QVBoxLayout(self)
|
self.main_layout = QVBoxLayout(self)
|
||||||
@@ -168,13 +156,16 @@ class TimerApp(QWidget):
|
|||||||
# 按钮区域
|
# 按钮区域
|
||||||
self.btn_area = QWidget()
|
self.btn_area = QWidget()
|
||||||
self.btn_layout = QHBoxLayout(self.btn_area)
|
self.btn_layout = QHBoxLayout(self.btn_area)
|
||||||
self.btn_4m = QPushButton("4分钟")
|
self.btn_5m = QPushButton("5分钟")
|
||||||
|
self.btn_6m = QPushButton("6分钟")
|
||||||
self.btn_other = QPushButton("其它")
|
self.btn_other = QPushButton("其它")
|
||||||
|
|
||||||
self.btn_4m.clicked.connect(lambda: self.start_countdown(240))
|
self.btn_5m.clicked.connect(lambda: self.start_countdown(300))
|
||||||
|
self.btn_6m.clicked.connect(lambda: self.start_countdown(360))
|
||||||
self.btn_other.clicked.connect(self.open_config)
|
self.btn_other.clicked.connect(self.open_config)
|
||||||
|
|
||||||
self.btn_layout.addWidget(self.btn_4m)
|
self.btn_layout.addWidget(self.btn_5m)
|
||||||
|
self.btn_layout.addWidget(self.btn_6m)
|
||||||
self.btn_layout.addWidget(self.btn_other)
|
self.btn_layout.addWidget(self.btn_other)
|
||||||
self.content_layout.addWidget(self.btn_area)
|
self.content_layout.addWidget(self.btn_area)
|
||||||
|
|
||||||
@@ -190,23 +181,11 @@ 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):
|
||||||
# exe所在目录
|
base_path = sys._MEIPASS
|
||||||
external_path = os.path.dirname(sys.executable)
|
|
||||||
else:
|
else:
|
||||||
# 当前工作目录
|
base_path = os.path.dirname(__file__)
|
||||||
external_path = os.getcwd()
|
alarm_file = os.path.join(base_path, "alarm.wav")
|
||||||
|
|
||||||
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)
|
||||||
@@ -264,9 +243,6 @@ class TimerApp(QWidget):
|
|||||||
x = screen_geometry.width() - self.width() - self.config['right_margin']
|
x = screen_geometry.width() - self.width() - self.config['right_margin']
|
||||||
y = self.config['top_margin']
|
y = self.config['top_margin']
|
||||||
self.move(x, y)
|
self.move(x, y)
|
||||||
|
|
||||||
# 将焦点还给上一个进程
|
|
||||||
self.return_focus_to_previous_window()
|
|
||||||
|
|
||||||
def center_on_screen(self):
|
def center_on_screen(self):
|
||||||
screen = QApplication.primaryScreen()
|
screen = QApplication.primaryScreen()
|
||||||
@@ -301,7 +277,7 @@ class TimerApp(QWidget):
|
|||||||
if hasattr(self, 'color_anim') and self.color_anim is not None:
|
if hasattr(self, 'color_anim') and self.color_anim is not None:
|
||||||
self.color_anim.stop()
|
self.color_anim.stop()
|
||||||
|
|
||||||
self.label_time.setStyleSheet("color: #2c3e50;")
|
self.label_time.setStyleSheet("color: #ecf0f1;")
|
||||||
|
|
||||||
self.is_running = True
|
self.is_running = True
|
||||||
|
|
||||||
@@ -385,24 +361,6 @@ class TimerApp(QWidget):
|
|||||||
self.anim_group.addAnimation(self.flash_anim)
|
self.anim_group.addAnimation(self.flash_anim)
|
||||||
self.anim_group.start()
|
self.anim_group.start()
|
||||||
|
|
||||||
def return_focus_to_previous_window(self):
|
|
||||||
# 清除当前窗口的焦点
|
|
||||||
self.clearFocus()
|
|
||||||
|
|
||||||
# 将窗口置于其他窗口下方
|
|
||||||
self.lower()
|
|
||||||
|
|
||||||
# 尝试激活其他窗口
|
|
||||||
app = QApplication.instance()
|
|
||||||
windows = app.topLevelWindows()
|
|
||||||
|
|
||||||
# 找到不是当前窗口的其他窗口
|
|
||||||
for window in windows:
|
|
||||||
if window != self.windowHandle() and window.isVisible():
|
|
||||||
# 尝试激活其他窗口
|
|
||||||
window.requestActivate()
|
|
||||||
break
|
|
||||||
|
|
||||||
def open_config(self):
|
def open_config(self):
|
||||||
dialog = ConfigDialog(self, self.config)
|
dialog = ConfigDialog(self, self.config)
|
||||||
if dialog.exec() == QDialog.Accepted:
|
if dialog.exec() == QDialog.Accepted:
|
||||||
|
|||||||
61
操作手册.md
61
操作手册.md
@@ -1,61 +0,0 @@
|
|||||||
# 述职计时器 操作手册
|
|
||||||
|
|
||||||
## 一、概述
|
|
||||||
|
|
||||||
述职计时器是一款专为述职演讲设计的倒计时工具。
|
|
||||||
|
|
||||||
## 二、快速开始
|
|
||||||
|
|
||||||
1. 双击 `countdown.exe` 启动程序
|
|
||||||
2. 点击 **5分钟** 或 **6分钟** 按钮开始倒计时
|
|
||||||
3. 2秒后窗口自动缩小为悬浮模式
|
|
||||||
|
|
||||||
## 三、功能说明
|
|
||||||
|
|
||||||
### 3.1 主界面
|
|
||||||
|
|
||||||
| 按钮 | 说明 |
|
|
||||||
|------|------|
|
|
||||||
| 5分钟 | 开始5分钟(300秒)倒计时 |
|
|
||||||
| 6分钟 | 开始6分钟(360秒)倒计时 |
|
|
||||||
| 其它 | 打开配置窗口 |
|
|
||||||
|
|
||||||
### 3.2 配置功能
|
|
||||||
|
|
||||||
点击 **其它** 按钮打开配置窗口,可设置以下选项:
|
|
||||||
|
|
||||||
| 配置项 | 说明 |
|
|
||||||
|--------|------|
|
|
||||||
| 自定义秒数 | 设置自定义倒计时时长(1-3600秒)可用来测试 |
|
|
||||||
| 提前告警(秒) | 设置提前播放告警音的时间(0-300秒) |
|
|
||||||
| 窗口置顶 | 勾选后窗口始终保持在其他窗口上方 |
|
|
||||||
| 透明度 | 调节窗口透明度(10%-100%) |
|
|
||||||
| 距离右边缘 | 微缩窗口距离屏幕右边缘的像素值 |
|
|
||||||
| 距离上边缘 | 微缩窗口距离屏幕上边缘的像素值 |
|
|
||||||
|
|
||||||
### 3.3 窗口操作
|
|
||||||
|
|
||||||
| 操作 | 功能 |
|
|
||||||
|------|------|
|
|
||||||
| 拖拽标题栏区域 | 移动窗口位置 |
|
|
||||||
| 双击微缩窗口 | 暂停倒计时,恢复正常窗口大小 |
|
|
||||||
|
|
||||||
### 3.4 告警与提醒
|
|
||||||
|
|
||||||
- **提前告警**:倒计时剩余时间达到"提前告警"设定值时,播放3次提示音
|
|
||||||
- **倒计时结束**:
|
|
||||||
- 微缩模式:文字红黄闪烁
|
|
||||||
- 正常模式:文字跳动 + 透明度闪烁
|
|
||||||
|
|
||||||
## 四、音频配置
|
|
||||||
|
|
||||||
程序支持自定义告警音效:
|
|
||||||
|
|
||||||
- 将 `alarm.wav` 音频文件放置在 **exe 同目录** 或 **当前工作目录**
|
|
||||||
- 程序会优先从外部目录加载,若未找到则使用内置音频
|
|
||||||
|
|
||||||
## 五、注意事项
|
|
||||||
|
|
||||||
1. 首次运行请确保 `alarm.wav` 与 exe 在同一目录,否则告警功能不可用
|
|
||||||
2. 微缩窗口位置可在配置中自定义
|
|
||||||
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