Один из вариантов, который у вас есть, - это сохранить время начала и во время каждой итерации основного l oop вы вычисляете разницу во времени и обновляете таймер.
Когда разница достигает 20 секунд, вы останавливаетесь и переходите к следующему вопрос, иначе вы сохраните текущее оставшееся время или все, что вы хотите с ним сделать, и начнете новый.
Вот пример c:
from time import time
TIME_PER_QUESTION = 20.0
# Loop questions
for i in range(3):
start = time()
current = time()
time_left = TIME_PER_QUESTION
while time_left > 0:
# Update your interface
# doStuff()... update()...
# Spam a bit for testing
print("Leftover time {:.0f}".format(time_left))
# Update current time and our timer
current = time()
time_left = TIME_PER_QUESTION - (current - start)
Конечно, вы можете добавить больше способов выйти из l oop и сохранить оставшееся время, пока вы делаете et c. и переходите к следующему вопросу.
Есть и другие способы добиться этого, но это единственное, что вы можете сделать. (Этот метод в основном используется для основных циклов в играх и тому подобном)
Как упоминалось в комментариях, вы, вероятно, также можете сделать это, используя функцию поточного таймера, если хотите.
EDIT
Что касается обновления текста в gui, я не уверен, работает ли ваш способ, но если вы говорите, что он никогда не обновлялся, возможно, попробуйте вместо этого:
window['t'].update("{:.0f}".format(time_left))