двойной щелчок для цикла

У меня есть простая программа на Python, которая считывает входные данные скрытого устройства из цикла for. Я не хочу выполнять разные действия (длительное, одиночное, двойное, тройное нажатие) для одной кнопки.

Проблема с моим решением заключается в том, что по сравнению со всеми другими решениями, которые я видел, мой цикл запускается только при нажатии кнопки. Это означает, что я не могу просто вызвать функцию с ограничением по времени, потому что я никогда не вызову одиночный щелчок.

Думаю, для этого мне нужна нить. Но я не уверен и не знаю, как я мог это сделать. Любая помощь приветствуется!

Это то, что я пробовал:

      clicked = False
def set_clicked():
    global clicked
    clicked = True


click_registered = False
click_time = time.time()
def click_handler():
    global click_registered, clicked, click_time

    if click_registered and time.time() - click_time > 0.35:
        click_registered = False
        print("single")

    if clicked:
        if click_registered:
            if time.time() - click_time < 0.35:
                click_registered = False
                print("double")
        else:
            click_registered = True
        clicked = False
        click_time = time.time()


for event in device.read_loop(): # loops forever
    if event.code == 1:  # button pressed
        set_clicked()

    click_handler()

Если после одного щелчка происходит другое действие, цикл не запускается, как и одиночный щелчок.

Я придумал следующее как возможное решение для обнаружения двойного щелчка. Но это все еще кажется не совсем правильным. У кого-нибудь есть элегантное решение для этого?

      import threading
import time

press_count = 0
def thread_function(name):
    global press_count
    start_time = time.time()
    
    while time.time() - start_time < 0.35:
        if press_count == 2:
            press_count = 0
            print("double")
            return
    print("single")
    press_count = 0
    return

for n in range(3):
    if len(threading.enumerate()) >= 1:
        press_count+=1

    if len(threading.enumerate()) == 1:
        t = threading.Thread(target=thread_function, args=(1,))
        t.start()

    if n == 0:
        time.sleep(0.5)
    if n == 1:
        time.sleep(0.1)

0 ответов

Другие вопросы по тегам