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
相关产品推荐
相关产品推荐

