You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Playsound编译为exe后无法播放声音问题求助

问题:PyInstaller编译exe后无声音输出

我用tkinter和playsound制作了一个可播放自定义声音的数字音效板,在VS Code中测试一切正常,但编译为exe文件后程序能运行却没有声音输出。我尝试将PyInstaller的编译模式从--onefile改为--onedir,也把音频文件放到了可执行文件所在目录,但都没有效果。请问是我的代码存在问题吗?

我的代码:

import tkinter
from tkinter import *
from PIL import ImageTk, Image
from playsound import playsound

win = Tk()
win.geometry('500x500')
win.maxsize(500,500)
win.title('Alarm Button')

def alarm():
    playsound(r'Announcement.mp3')

btn_image = PhotoImage(file='BUTTON.png')
comp_logo = PhotoImage(file='aaaa.png')
Logo = Label(win, image = comp_logo).place(x=390, y=470)

Press_me = Button(win, image=btn_image, command=alarm, borderwidth = 0)
Press_me.place(x=45, y=15)

def handler(e):
    alarm()

win.bind('<Return>', handler)
win.mainloop()
解决方案

问题核心是playsound模块与PyInstaller的兼容性缺陷,加上编译后文件路径识别逻辑缺失,按以下步骤修改即可解决:

  • 替换playsound模块
    playsound在打包exe时经常出现路径或运行时依赖问题,建议改用pygame替代,先安装依赖:
pip install pygame

然后修改音频播放函数:

import pygame

def alarm():
    pygame.mixer.init()
    pygame.mixer.music.load('Announcement.mp3')
    pygame.mixer.music.play()
    # 等待音频播放完成,避免程序提前结束播放
    while pygame.mixer.music.get_busy():
        pygame.time.Clock().tick(10)
  • 修复编译后资源路径问题
    PyInstaller打包--onefile模式时,会将资源文件解压到临时目录,直接用相对路径无法访问。添加路径获取函数:
import os
import sys

def get_resource_path(relative_path):
    try:
        # 打包后获取临时资源目录
        base_path = sys._MEIPASS
    except Exception:
        # 未打包时使用当前目录
        base_path = os.path.abspath(".")
    return os.path.join(base_path, relative_path)

然后将所有资源文件路径替换为该函数返回值:

def alarm():
    pygame.mixer.init()
    sound_path = get_resource_path('Announcement.mp3')
    pygame.mixer.music.load(sound_path)
    pygame.mixer.music.play()
    while pygame.mixer.music.get_busy():
        pygame.time.Clock().tick(10)

btn_image = PhotoImage(file=get_resource_path('BUTTON.png'))
comp_logo = PhotoImage(file=get_resource_path('aaaa.png'))
  • 正确使用PyInstaller打包命令
    打包时需要明确指定资源文件,避免丢失:
# Windows下--onefile模式打包命令
pyinstaller --onefile --add-data "Announcement.mp3;." --add-data "BUTTON.png;." --add-data "aaaa.png;." your_script.py

# Mac/Linux下将分号改为冒号
pyinstaller --onefile --add-data "Announcement.mp3:." --add-data "BUTTON.png:." --add-data "aaaa.png:." your_script.py

内容的提问来源于stack exchange,提问作者Lord_Kordec

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 13:35:16