当我将它与tkinter一起使用时,Python文本到语音(pyttsx3)会延迟

时间:2017-07-30 05:27:59

标签: python-3.x user-interface tkinter

我正在尝试学习GUI,我想将一个简单的聊天机器人作为一个项目,它也可以说(使用pyttsx3库)...但是当它说话时,它首先说话然后停止,然后是在GUI窗口中标出它。总之...它稍有延迟......这是代码

import random
import tkinter as tk
import pyttsx3
engine = pyttsx3.init()

def speak(ui):
    engine.say(ui)
    engine.runAndWait()
    engine.stop()

root = tk.Tk()
user_input = tk.Entry(root)
user_input.grid(row = 0, column = 1)
root.geometry("200x200")
greetings = ['hola', 'hello', 'hi', 'Hi', 'hey!', 'hey']
question = ['How are you?', 'How are you doing?']
responses = ['Okay', "I'm fine"]
huh = "I did not understand what you said"

def cb():
    user_text = user_input.get()
    if user_text in greetings:
        bot_text = random.choice(greetings)
        speak(bot_text)
    elif user_text in question:
        bot_text = random.choice(responses)
        speak(bot_text)
    else:
        bot_text = huh
    output.config(text=bot_text)

button = tk.Button(root, text="Enter", command=cb)
button.grid(row = 0)

output = tk.Label(root, text='')
output.grid()

tk.mainloop()

有什么方法可以解决这个问题吗?提前谢谢!

2 个答案:

答案 0 :(得分:0)

这个概念对我来说是陌生的,但是我认为您正在寻找的是多线程。通过在两个单独的线程上打开GUI和bot,它们可以同时运行。

答案 1 :(得分:0)

这是一个旧的线程,但是可能对某人有用:不要在此简单任务中使用线程,您将使该过程变得无用繁重,只需将Lambda与按钮中的命令一起使用即可:

button = tk.Button(root, text="Enter", command=lambda: cb())