Tkinter代码调用一次后停止运行,如何实现直至点击退出按钮才终止?
修复Tkinter朗读程序仅运行一次就关闭的问题
我来帮你搞定这个问题!你的程序之所以在调用一次朗读功能后就异常关闭,主要是因为pyttsx3引擎的使用方式和Tkinter的事件循环冲突了,还有一些小细节需要调整。下面是修复方案和详细解释:
问题根源分析
- 重复创建pyttsx3引擎:你在
Textspeaker()函数里每次调用都重新初始化engine = pyttsx3.init(),这不仅效率低下,还会和Tkinter的主线程事件循环产生冲突,导致程序意外退出。 - 多余的界面更新调用:
root.update()在这里是不必要的,Tkinter的mainloop()会自动处理界面的事件响应和更新,手动调用反而可能干扰正常流程。 - 控件变量赋值错误:比如
EntryEntrys = tk.Entry(...).grid(...),这种写法会让变量存储grid()方法的返回值None,如果之后需要操作输入框控件(比如清空内容)就会出错。
修复后的完整代码
import speech_recognition as sr import pyttsx3 from colorama import init from colorama import Fore, Back, Style import tkinter as tk init() # 全局初始化pyttsx3引擎,整个程序只创建一次 engine = pyttsx3.init() engine.setProperty('rate', 160) root = tk.Tk() root.title("Textspeaker") Entrys = tk.StringVar() # 分开创建控件和布局,确保变量能引用到控件对象 LabelEntrys = tk.Label(text="What do you want to be said?") LabelEntrys.grid(row=0, column=0, padx=0, pady=10) EntryEntrys = tk.Entry(textvariable=Entrys) EntryEntrys.grid(row=0, column=1) def Textspeaker(): question = Entrys.get() # 增加空内容判断,避免无效朗读 if question.strip(): engine.say(str(question)) engine.runAndWait() def stopthecode(): root.destroy() # 同样分开创建按钮和布局 Button = tk.Button(text='Execute', command=Textspeaker, fg='red', font='Helvetica 18 bold') Button.grid(row=1, column=1) Button2 = tk.Button(text='Quit', command=stopthecode, fg='red', font='Helvetica 18 bold') Button2.grid(row=2, column=1) root.mainloop()
修复后的效果
- 可以多次点击Execute按钮朗读输入的内容,完全不会出现调用一次就关闭的问题
- 增加了空内容判断,输入框为空时不会执行朗读操作
- 只有点击Quit按钮,程序才会正常关闭
内容的提问来源于stack exchange,提问作者Eren Ucar
相关产品推荐
相关产品推荐

