Изменение порядка выполнения в python

#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()