下面我将从简单到复杂,为你展示如何使用 winsound 实现报警功能。

最简单的报警声音
这是最基础的用法,播放一个简单的 "哔" 声。
import winsound
import time
print("系统报警!系统报警!")
# 播放一个简单的提示音
winsound.Beep(1000, 500) # 频率1000Hz,持续500毫秒
print("报警结束。")
代码解释:
import winsound: 导入winsound模块。winsound.Beep(frequency, duration): 这是核心函数。frequency: 频率,单位是赫兹,范围是 37 到 32767。1000是一个比较常见的提示音频率。duration: 持续时间,单位是毫秒。500表示声音持续半秒。
连续报警(嘀嘀嘀声)
在很多场景下,报警声是连续的、重复的,我们可以使用 for 循环和 time.sleep() 来实现。
import winsound
import time
print("检测到严重错误!开始持续报警...")
# 播响5次,每次间隔0.5秒
for i in range(5):
print(f"报警第 {i+1} 次!")
winsound.Beep(1000, 200) # 声音短促
time.sleep(0.5) # 暂停0.5秒
print("报警停止。")
代码解释:

for i in range(5): 创建一个循环,执行5次。winsound.Beep(1000, 200): 播放一个短促的 200ms 的声音。time.sleep(0.5): 让程序暂停 0.5 秒,这样声音之间就有了间隔,形成 "嘀嘀嘀" 的效果。
更复杂的报警音(频率变化)
报警声的音调会变化,以表示不同的紧急程度,我们可以通过改变 Beep 函数的 frequency 参数来实现。
import winsound
import time
print("警告!警告!系统即将崩溃!")
# 播放一个频率递增的报警声
for i in range(10):
# 频率从 500Hz 开始,每次增加 100Hz
frequency = 500 + (i * 100)
winsound.Beep(frequency, 150)
time.sleep(0.1)
print("报警结束。")
播放系统预设的 WAV 文件
Beep 声音比较单调,如果你有更复杂的报警声音(.wav 格式的音频文件),winsound 也可以播放。
假设你的项目目录下有一个名为 alarm.wav 的文件:
import winsound
print("播放自定义报警音!")
try:
# 播放指定的 WAV 文件
# 如果文件不存在或路径错误,会抛出异常
winsound.PlaySound("alarm.wav", winsound.SND_FILENAME)
# 或者使用绝对路径
# winsound.PlaySound("C:\\Users\\YourUser\\Desktop\\alarm.wav", winsound.SND_FILENAME)
except FileNotFoundError:
print("错误:找不到 alarm.wav 文件!")
# 如果找不到文件,回退到默认的 Beep 声
winsound.Beep(1000, 1000)
print("播放结束。")
PlaySound 函数的常用标志:

winsound.SND_FILENAME: 表示第一个参数是一个文件名(字符串)。winsound.SND_ASYNC: 异步播放,声音会在后台播放,你的 Python 程序会立即继续执行,而不会等待声音播放完毕。winsound.SND_LOOP: 循环播放,这个标志通常与SND_ASYNC一起使用,让声音无限循环播放,你需要调用winsound.PlaySound(None, 0)来停止它。winsound.SND_ALIAS: 播放系统预设的声音。winsound.SND_ALIAS('SystemExclamation')会播放 Windows 的“警告”声。
示例:异步循环播放
import winsound
import time
print("开始异步循环播放报警音,5秒后停止...")
# 异步循环播放
winsound.PlaySound("SystemExclamation", winsound.SND_ALIAS | winsound.SND_ASYNC | winsound.SND_LOOP)
# 程序继续执行其他任务
for i in range(5):
print(f"程序正在运行中... {i+1}/5")
time.sleep(1)
# 停止播放
print("停止报警音。")
winsound.PlaySound(None, 0) # 停止所有异步声音
总结与注意事项
| 功能 | 函数 | 参数说明 | 适用场景 |
|---|---|---|---|
| 简单蜂鸣 | winsound.Beep(frequency, duration) |
frequency: 频率 (37-32767 Hz)duration: 持续时间 (毫秒) |
简单提示、任务完成提醒 |
| 播放WAV文件 | winsound.PlaySound(filename, flags) |
filename: WAV文件路径flags: SND_FILENAME, SND_ASYNC 等 |
播放自定义、复杂的报警音 |
| 播放系统声音 | winsound.PlaySound(alias, flags) |
alias: 如 'SystemAsterisk', 'SystemExclamation'flags: SND_ALIAS, SND_ASYNC 等 |
调用系统内置的提示音 |
重要注意事项:
- Windows 专属:
winsound是 Windows 的标准库,在 macOS 或 Linux 上会报错ModuleNotFoundError: No module named 'winsound',跨平台开发时,可以考虑使用playsound等第三方库。 - 权限问题: 在某些特殊环境下(如某些 Docker 容器或受限的沙盒环境),即使是在 Windows 上,
winsound也可能因为无法访问音频设备而失败。 - 用户体验: 对于长时间运行的报警,异步播放 (
SND_ASYNC) 是一个很好的选择,因为它不会阻塞你的主程序,但请记得在适当时机调用winsound.PlaySound(None, 0)来停止它,否则它会一直循环下去。
