Timer stops updating when an audio is played

78 Views Asked by At

I have used after() method to update the time remaining for quiz and converted text of question to audio using gtts module and played that using playsound module. But when the audio is played timer stops updating. How can I fix it?

import playsound
import tkinter
import gtts
import os

def speak_que():
    global audio_no
    sound = gtts.gTTS(question_label["text"], lang = "en")
    file_name = "Audio_" + str(audio_no) + ".mp3"
    sound.save(file_name)
    playsound.playsound(file_name)
    os.remove(file_name)
    audio_no += 1

def change_time():
    pre_time = int(time_label["text"])
    if pre_time != 1:
        time_label.config(text = pre_time-1)
        time_label.after(1000, change_time)
    else:
        window.destroy()

window = tkinter.Tk()
audio_no = 0
time_label = tkinter.Label(window, text = "15")
time_label.after(1000, change_time)
question_label = tkinter.Label(window, text = "What is the sum of 4 and 2")
answer = tkinter.Entry(window)
speak = tkinter.Button(window, text = "Speak", command = speak_que)
time_label.pack()
question_label.pack()
answer.pack()
speak.pack()
window.mainloop()
1

There are 1 best solutions below

0
On BEST ANSWER

First, make sure your speak_que() routine is completing, if not, you can install the older version of playsound 1.2.2 as the newest version tends to have issues.

pip uninstall playsound

pip install playsound==1.2.2

Next, if you want the timer to continue during speak_que() (or any two operations in parallel); you'll have to use threading, see below.

import playsound
import tkinter
import gtts
import os
from threading import *

def speak_que():
    global audio_no
    sound = gtts.gTTS(question_label["text"], lang = "en")
    file_name = "Audio_" + str(audio_no) + ".mp3"
    sound.save(file_name)
    playsound.playsound(file_name)
    os.remove(file_name)
    audio_no += 1

def threadedSound():
    t1=Thread(target=speak_que)
    t1.start()

def change_time():
    pre_time = int(time_label["text"])
    if pre_time != 1:
        time_label.config(text = pre_time-1)
        time_label.after(1000, change_time)
    else:
        window.destroy()

window = tkinter.Tk()
audio_no = 0
time_label = tkinter.Label(window, text = "15")
time_label.after(1000, change_time)
question_label = tkinter.Label(window, text = "What is the sum of 4 and 2")
answer = tkinter.Entry(window)
speak = tkinter.Button(window, text = "Speak", command = threadedSound)
time_label.pack()
question_label.pack()
answer.pack()
speak.pack()
window.mainloop()