двойной щелчок для цикла
У меня есть простая программа на 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)