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

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_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:15:03