PySimpleGUI如何实现后台播放音频 解决音频先于GUI加载问题
问题原因
你遇到的阻塞问题根源是pydub.playback.play()是同步阻塞方法,运行该方法时程序会暂停所有后续逻辑,直到音频完整播放结束才会继续执行窗口渲染逻辑,所以出现音频先播完才显示GUI界面的现象。
解决方案
使用Python标准库threading将音频播放逻辑放到独立子线程中运行,不占用GUI主线程的执行资源即可解决阻塞问题。该方案仅用到Python标准库模块,不会引入额外依赖,打包为exe文件时不会出现新增的报错问题,适配你选择pydub库的需求。
修正后可运行代码
from pydub import AudioSegment from pydub.playback import play import PySimpleGUI as sg import threading st = "W" if st == "W": path_to_file = "congratulation.mp3" song = AudioSegment.from_mp3(path_to_file) elif st == "F": path_to_file = "fail.mp3" song = AudioSegment.from_mp3(path_to_file) layout = [[sg.Text("You've " + st)], [sg.Button("OK")]] window = sg.Window("Test", layout) # 音频播放函数,用于子线程调用 def play_audio(sound): play(sound) # 启动守护子线程播放音频,主程序退出时线程自动销毁 audio_thread = threading.Thread(target=play_audio, args=(song,), daemon=True) audio_thread.start() # GUI事件循环 while True: event, values = window.read() if event is None or event == "OK": window.close() break
修改说明
- 新增导入
threading模块处理多线程逻辑,无额外第三方依赖 - 将音频播放逻辑封装为独立函数,作为子线程的执行目标
- 启动音频播放子线程后再进入GUI事件循环,两个逻辑并行运行互不阻塞
- 给线程设置
daemon=True属性,避免关闭GUI后音频仍在后台播放的问题 - 修正原代码中
window2.read()的笔误,原代码定义的窗口对象为window,直接调用window2会触发名称报错
内容的提问来源于stack exchange,提问作者SimpleGuy_
相关产品推荐
相关产品推荐

