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

pyttsx3绑定按键后仅运行一次就导致GUI崩溃,求解决方案

解决方案:pyttsx3绑定按键重复触发崩溃问题

问题根源

每次触发按键时都会新建一个pyttsx3.Engine实例,多次创建会导致底层音频资源冲突,加上线程未正确管理,最终引发GUI崩溃。不管是Tkinter还是PyQt5,核心问题一致。

修复步骤

  • 全局复用引擎实例:只初始化一次pyttsx3.Engine,避免重复创建资源
  • 线程内正确管理引擎状态:语音合成完成后清空引擎队列,防止残留任务干扰后续调用
  • 处理GUI事件传播:绑定事件的回调返回'break',避免事件冒泡引发额外问题

修复后的代码

from tkinter import *
import pyttsx3
import threading

# 全局初始化引擎,仅执行一次
engine = pyttsx3.init()

def start_eng(txt):
    # 复用全局引擎实例
    engine.say(txt)
    engine.runAndWait()
    # 清空引擎队列,释放临时资源
    engine.stop()

def run_msg(key):
    text = txt.get()
    # 以守护线程启动语音合成,不阻塞GUI主线程
    threading.Thread(target=start_eng, args=(text,), daemon=True).start()
    print("space clicked")
    # 阻止事件继续传播
    return 'break'

window = Tk()
window.title("Testing")
window.geometry('300x300')
lbl = Label(window, text="Hello")
txt = Entry(window, width=10)

lbl.grid(column=0, row=0)
txt.grid(column=1, row=1)
txt.bind('<space>', run_msg)

window.mainloop()

适配PyQt5的核心逻辑

和Tkinter思路一致:

  1. 全局初始化pyttsx3.Engine实例
  2. 在子线程中调用engine.say()和engine.runAndWait()
  3. 线程设为守护模式,避免主程序退出后残留线程

若仍有异常,可尝试指定驱动初始化:

# Windows指定sapi5,Linux指定espeak,macOS指定nsss
engine = pyttsx3.init(driverName='sapi5')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 11:33:46