使用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
修复方向
- 线程资源管理:将播放线程设为守护线程,避免线程结束时触发主进程资源冲突:
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()
- 音频资源显式释放:在
play函数中播放完成后主动清理资源,避免底层泄漏:
def play(audio_segment): play_obj = audio_segment.play() play_obj.wait_done() del play_obj # 显式释放播放对象
音频文件校验:确认
./audio/beep.wav文件完整、格式标准,可替换为其他无损坏的WAV文件测试,排除文件导致的底层解码错误。GUI线程安全:确保播放线程中无任何CustomTkinter的GUI操作,所有界面交互仅在主线程执行。
内容的提问来源于stack exchange,提问作者Chucksterv
相关产品推荐
相关产品推荐

