#python-3.x #tkinter #pyttsx3
#python-3.x #tkinter #pyttsx3
Вопрос:
Я недавно начал программировать и написал довольно простую программу. Но застрял в точке. Моя программа делает очень простую вещь: когда вы нажимаете кнопку, она произносит строку и показывает этот текст на экране. Но сначала он произносит текст, а затем отображает его на экране, но я хочу его обратного, т.Е. Сначала он должен отображать его на экране, а затем произносить текст.
from tkinter import *
import pyttsx3
root = Tk()
def speak():
engine = pyttsx3.init()
say = "I am speaking."
text.insert("0.0", say)
engine.say(say)
engine.runAndWait()
text = Text(root)
text.pack()
btn = Button(root, text="speak", command=speak)
btn.pack()
root.mainloop()
Заранее спасибо.
Комментарии:
1. Добавить
text.update_idletasks()
послеtext.insert("0.0", say)
.
Ответ №1:
Это связано с тем, что engine.runAndWait()
блокирует приложение, и поэтому текстовое поле не может быть обновлено tkinter mainloop до завершения разговора.
Вы можете вызвать text.update_idletasks()
, чтобы заставить tkinter обновить текстовое поле перед началом разговора.:
engine = pyttsx3.init() # initialize only once
def speak():
say = "I am speaking."
text.insert("0.0", say)
text.update_idletasks() # force tkinter update
engine.say(say)
engine.runAndWait()
Комментарии:
1. Это абсолютно то, чего я хочу, большое спасибо.
Ответ №2:
Вы могли бы отложить звонок, чтобы engine.say
from tkinter import *
import pyttsx3
def speak(sentence):
engine.say(sentence)
engine.runAndWait()
def display_and_speak():
sentence = "I am speaking."
text.insert("1.0", sentence)
root.after(1000, speak, sentence) # call to speak delayed 1 second
engine = pyttsx3.init()
root = Tk()
text = Text(root)
text.pack()
btn = Button(root, text="speak", command=display_and_speak)
btn.pack()
root.mainloop()