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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:26:34