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

使用pydub播放音频后如何保持Tkinter窗口不关闭?

文本转摩尔斯音频应用段错误(Exit Code 139)修复方案

问题背景

我用Python开发了一个基础的文本转音频应用,功能是获取用户输入后点击按钮生成并播放摩尔斯码音频,但音频播放完毕后窗口会关闭,且退出时抛出段错误:

Process finished with exit code 139 (interrupted by signal 11:SIGSEGV)

试过导出pydub文件用simpleaudio播放,问题依旧。

相关代码

主GUI代码

app = CTk()
app.title("Text to Morse Code")
app.geometry("600x400")


def gui_handler():
    def input_to_morse():
        morse_code = text_to_morse(entry.get())
        morse_audio = morse_to_audio(morse_code)

        threading.Thread(target=play, args=(morse_audio,)).start()

        print("Hello")

    gen_morse_button = CTkButton(app, text="Generate Morse Code", command=input_to_morse)
    entry = CTkEntry(app, placeholder_text="Enter text to be converted")

    app.grid_columnconfigure(0, weight=1)
    entry.grid(row=0, column=0, padx=40, pady=20, sticky="ew")
    gen_morse_button.grid(row=1, column=0, padx=40, pady=20, sticky="ew")


gui_handler()
app.mainloop()

morse_to_audio函数代码

# Audio objects
dash = AudioSegment.from_file("./audio/beep.wav", format="wav")[:200]
dot = dash[:50]
short_gap = AudioSegment.silent(duration=100)
medium_gap = AudioSegment.silent(duration=200)
long_gap = AudioSegment.silent(duration=500)

def morse_to_audio(morse_code: list):
    """
    Converts a given list of morse code values and returns an audio file.
    :param morse_code: List of Morse code values depicted in "." "-"
    :return: Audio of Morse code being played.
    """
    morse_audio = AudioSegment.empty()
    for i, letter in enumerate(morse_code):
        if letter == " ":
            morse_audio += long_gap
        else:
            for j, symbol in enumerate(letter):
                if symbol == ".":
                    morse_audio += dot
                elif symbol == "-":
                    morse_audio += dash
                # if the symbol isn't the last symbol in a letter add a short gap
                if j < len(letter) - 1:
                    morse_audio += short_gap
            # if there is a next letter, and it isn't a space add a medium gap
            if i + 1 < len(morse_code) and morse_code[i + 1] != " ":
                morse_audio += medium_gap
    return morse_audio

修复方向

  1. 线程资源管理:将播放线程设为守护线程,避免线程结束时触发主进程资源冲突:
def input_to_morse():
    morse_code = text_to_morse(entry.get())
    morse_audio = morse_to_audio(morse_code)

    audio_thread = threading.Thread(target=play, args=(morse_audio,))
    audio_thread.daemon = True  # 设置为守护线程,随主进程退出
    audio_thread.start()
  1. 音频资源显式释放:在play函数中播放完成后主动清理资源,避免底层泄漏:
def play(audio_segment):
    play_obj = audio_segment.play()
    play_obj.wait_done()
    del play_obj  # 显式释放播放对象
  1. 音频文件校验:确认./audio/beep.wav文件完整、格式标准,可替换为其他无损坏的WAV文件测试,排除文件导致的底层解码错误。

  2. GUI线程安全:确保播放线程中无任何CustomTkinter的GUI操作,所有界面交互仅在主线程执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 16:57:46