【问题标题】:PySImpleGUI -> How to play audio in the BackgroundPySImpleGUI -> 如何在后台播放音频
【发布时间】:2021-10-21 12:18:06
【问题描述】:

我正在使用 PySimpleGUI 创建一个简单的程序,该程序应该在 GUI 的后台播放音乐,但问题是先播放音频,然后才出现 GUI,有什么方法可以解决这个问题?

这里我使用 pydub 播放音频,因为其他人在转换为 .exe 时可能会导致错误

from pydub import AudioSegment
from pydub.playback import play
from PySimpleGUI import *
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=[[Text("You've "+st)],[Button("OK")]]
window=Window("Test",layout)
while True:
    play(song)
    e,v=window2.read()
    if e==None or e=="OK":
        exit()

【问题讨论】:

  • 是否有任何其他播放音频的模块可以解决此问题?
  • 你能在单独的线程中运行播放器吗?
  • @RufusVS 使用线程,得到与问题相同的结果:[

标签: python pysimplegui pydub


【解决方案1】:

播放 mp3 的示例代码,但仅用于在窗口关闭或播放下一首歌曲后不间断播放。 pydub 的 bug 或功能在此忽略。

import threading
from pathlib import Path

from pydub import AudioSegment
from pydub.playback import play
import PySimpleGUI as sg


font = ('Courier New', 11)
sg.theme('DarkBlue3')
sg.set_options(font=font)

layout = [
    [sg.Text('Song file to play')],
    [sg.Input(enable_events=True, key='-SONG-'),
     sg.FileBrowse(file_types=(("All MP3 Files", "*.mp3"),))],
    [sg.Button('Play'), sg.Button('Exit')],
]

window = sg.Window("Pydub MP3 Player", layout, finalize=True)
song = None
while True:

    event, values = window.read()

    if event in (sg.WINDOW_CLOSED, 'Exit'):
        break
    elif event == '-SONG-':
        path_to_file = values['-SONG-']
        if Path(path_to_file).is_file():
            try:
                song = AudioSegment.from_mp3(path_to_file)
            except:
                pass
    elif event == 'Play':
        if song:
            threading.Thread(target=play, args=(song,), daemon=True).start()

window.close()

【讨论】:

  • 天啊...兄弟,这首歌一遍又一遍地重复,就像在运行病毒:) 最后我停止了这个过程。实际上,我正在寻找只播放一次声音的东西(声音只有 5 秒长),还有其他方法吗?
  • 尝试用其他库玩,比如VLC,参考github.com/PySimpleGUI/PySimpleGUI/blob/master/DemoPrograms/…
【解决方案2】:

我相信解决您的问题的最简单方法是创建一个播放声音的线程。

import threading as thread

# Your code

while True:
    thread.start_new_thread(play, (song, ))
    # The rest of your code

如果您想做的是在程序继续运行的同时在后台播放声音,上述方法应该可以工作。但是,这不允许您在中间停止声音,并且如果循环快速连续运行多次,它可能会播放多个重叠的声音实例。

Pydub 有一个关于类似问题的已解决问题:https://github.com/jiaaro/pydub/issues/160

不过,那里的答案比您在问题中要求的要全面一些。

编辑添加:我相信有其他非默认播放器默认执行此操作或类似操作,但如果声音是简单的、令人振奋的“叮”声或悲伤的蜂鸣器,更复杂的解决方案可能是多余的。

【讨论】:

  • 兄弟,但声音是先播放的,然后才出现 GUI :(
猜你喜欢
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2012-03-21
  • 1970-01-01
相关资源
最近更新 更多