双击 For 循环

double click in for loop

提问人:grasshide 提问时间:11/16/2023 最后编辑:grasshide 更新时间:11/16/2023 访问量:57

问:

我有一个简单的 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)
Python 多线程 for 循环 双击

评论

0赞 Ulrich Eckhardt 11/16/2023
你是在从内部循环调用,你确定吗?在任何情况下,每次双击都是从单击开始的,因此在您收到单击时,您不可能决定它将是两者中的哪一个。不过,您可以在某个阈值时间跨度后决定。为此,我将使用基于 -的循环,这比使用另一个线程更简单。click_handler()select()
0赞 grasshide 11/16/2023
@UlrichEckhardt你是对的。对不起,我的错误。我删除了与我的问题无关的所有内容,并搞砸了缩进。for 循环实际上不是 click_handler 的一部分。我改变了这一点。
0赞 grasshide 11/16/2023
> 在任何情况下,每次双击都是从单击开始的,因此当您收到单击时,您不可能决定它将是两者中的哪一个。真。我的解决方案考虑到了这一点。它“保留”单击,并且仅在时间占用后触发它。除非未触发循环,则不会触发。

答: 暂无答案