Можно ли обнулить time.perf_counter? Как правильно остановить функцию?

Сделал свою первую прогу на tkinter, но через жуткие костыли. Вот картинка игры: введите сюда описание изображения

Вкратце, это игра на внимательность, у вас есть поле определенного цвета, например зеленое, и вам нужно кликнуть на кнопку, на которой будет написано green, но сама кнопка другого цвета. Был бы рад, если бы вы помогли разобраться с некоторыми вещами

  1. Таймер я сделал через time.perf_counter(), но он запускается до вызова функции random_task(update_clock()). Т.е во время загрузки программы. Почему так? Его можно как то обнулить? Для первого запуска, и для рестарта, допустим.

  2. Каждый раз как я кликаю на любую кнопку, запускается функция random_task, которая генерирует следующую случайность. Как мне отключить программу, после того как таймер пробьет 10 секунд?

Я пробовал добавлять в if now > 10: Button.config(commands=) в принципе работает, только вот еще больше костылей...

['state] = 'disabled' не дает нужно результата.

  1. И как правильно подойти к случайному перебору списка, удаляя уже заюзанные элементы? без этих костылей в виде a1, a2.
from tkinter import *
import random
import time

root = Tk()
colors = ['red', 'green', 'blue', 'orange', 'black']
points = 0
text_task = "" # Рандомное задание
a1 = 6 # Эти переменные нужны на старте, чтобы программа не удаляла элементы внутри массива
a2 = 6 #

# Функция рандома всех кнопок, текста и цвета
def random_task():
    global col, col_text, text_task
    col = ['red', 'green', 'blue', 'orange', 'black']  # Списки из которых рандомно выбирается
    col_text = ['red', 'green', 'blue', 'orange', 'black']
    text_task = colors[random.randint(0, len(colors) - 1)] # рандомное задание
    lab.config(bg=text_task)
    # Рандом цвета кнопки
    def random_color():
        if a2 < 5: #  # удаляю из списка использованный текст, выбранный в random_text()
            col_text.pop(a2) #  
        num = random.randint(0, len(col) - 1)
        global a1 # Не знаю как сделать без этой задротской ерунды
        a1 = num
        return num
    # Рандом текста на кнопке
    def random_text():
        if a1 < 5: # удаляю из списка использованный цвет, выбранный в random_color()
            col.pop(a1)
        num = random.randint(0, len(col_text) - 1)
        global a2
        a2 = num
        return num

    # Создаем рандомные кнопки
    but.config(bg=col[random_color()], text=col_text[random_text()])
    but1.config(bg=col[random_color()], text=col_text[random_text()])
    but2.config(bg=col[random_color()], text=col_text[random_text()])
    but3.config(bg=col[random_color()], text=col_text[random_text()])
    but4.config(bg=col[random_color()], text=col_text[random_text()])

    def abs(): # муторная хуйня, чтобы по завершению формирования всех кнопок "обнулить" а2, чтобы в первой функции иф не сработал
        global a2 # бред, но просто без функции не получается присвоить значение для а2
        a2 = 6
    abs()

    def update_clock(): #Таймер. Как ни обнуляй, но отсчет начинает идти с запуска программы, а не запуска функции :(
        now = int(time.perf_counter()) 
        time_left.configure(text=now)
        root.after(1000, update_clock)
        if now > 10:
            time_left.configure(text='Время и стекло')
            result.configure(text=f'Ваш результат: {points}')
            return

    update_clock()


def on_click(event):
    global text_task
    global points
    button_text = event.widget.cget('text') # получаем значение текстового поля нажимаемой кнопки
    if button_text == text_task: # сравниваем
        points += 1
        result.config(text=points)
    else:
        points -=1
        result.config(text=points)



# Визуал

# Задание и результат
lab = Label(root, text="Нужно выбирать кнопки с текстом, \nкоторые соответствуют цвету этого поля", bg="#fff", fg="black", width="40", height="10") # Внутри - параметры. 1 на каком виджете будет располагаться данный
result = Label(root, text="Очки", bg="#fff", fg="black", width="40", height="5")
time_left = Label(root, text="Clock", bg="#fff", fg="black", width="40", height="5")

#Кнопка старта
letsgo = but = Button(root, text="Поехали", bg="grey", fg="#fff", width='40', height="3", command=random_task)

#Кнопки клика
but = Button(root, text="Применять", bg="grey", fg="#fff", width='40', height="3", command=random_task)
but1 = Button(root, text="Применять", bg="grey", fg="#fff", width='40', height="3", command=random_task)
but2 = Button(root, text="Применять", bg="grey", fg="#fff", width='40', height="3", command=random_task)
but3 = Button(root, text="Применять", bg="grey", fg="#fff", width='40', height="3", command=random_task)
but4 = Button(root, text="Применять", bg="grey", fg="#fff", width='40', height="3", command=random_task)

but.bind('<Button-1>', on_click) # Событие по левому щелчку
but1.bind('<Button-1>', on_click)
but2.bind('<Button-1>', on_click)
but3.bind('<Button-1>', on_click)
but4.bind('<Button-1>', on_click)

lab.pack() # pack - располагает элемент на главном виджете
letsgo.pack()
but.pack()
but1.pack()
but2.pack()
but3.pack()
but4.pack()
time_left.pack()
result.pack()

root.mainloop() # Запуск программы

Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Вот пример простенькой игры на время и заодно пример как можно задать вопрос:

import time

start = time.perf_counter()
input('Нажми Enter как можно скорее!')
finish = time.perf_counter()
duration = 1000 * (finish - start)
print(f'\nОтличная реакция! Задержка {duration:.0f} мс.')
$ python game.py
Нажми Enter как можно скорее!

Отличная реакция! Задержка 130 мс.

$ python game.py
Нажми Enter как можно скорее!

Отличная реакция! Задержка 454 мс.

$ echo "" | python game.py
Нажми Enter как можно скорее!
Отличная реакция! Задержка 0 мс.
→ Ссылка