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思路一致:
- 全局初始化
pyttsx3.Engine实例 - 在子线程中调用
engine.say()和engine.runAndWait() - 线程设为守护模式,避免主程序退出后残留线程
若仍有异常,可尝试指定驱动初始化:
# Windows指定sapi5,Linux指定espeak,macOS指定nsss engine = pyttsx3.init(driverName='sapi5')
内容的提问来源于stack exchange,提问作者Attiq Rahman
相关产品推荐
相关产品推荐

