如何避免“on_press”监听事件循环?

Posted

技术标签:

【中文标题】如何避免“on_press”监听事件循环?【英文标题】:How to avoid loop on "on_press" listener event? 【发布时间】:2020-04-13 06:45:30 【问题描述】:

我正在编写一段非常简单的代码。

我想听键盘。 当我按 F11 时,必须显示消息“已激活...”,仅显示一次。 当我再次按 F11 时,必须显示消息“已停用...”,而且只显示一次。 等等…… 当我按 F12 时,我希望监听器停止。

这是我的一段代码,当我按下 F11 时,我很难找到正确的实现来避免不断循环(“激活...停用...激活...停用...”)。

此外,欢迎任何有关实现更好、更先进、更 Pythonic 的建议!

# -*- coding: utf-8 -*-

from pynput import keyboard

is_active = False

def on_press(key):
    global is_active
    # Activate/Deactivate when pressing F11
    if key == keyboard.Key.f11:
        if is_active:
            is_active = False
            print("Deactivate...")
        else:
            is_active = True
            print("Activate...")
    # Stop "on_press" listener
    if key == keyboard.Key.f12:
        return False

with keyboard.Listener(on_press=on_press) as listener:
    listener.join()

【问题讨论】:

【参考方案1】:

你会想要使用

with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()

当您按住一个键时,您将获得多个事件,就像您按住 aaaaaaaaaaaaaaaaaaaaaaaaa 键而不松手一样。您需要设置一个锁定机制,在第一次按下时您不会让它再次发生,直到您释放键。

修改代码:

# -*- coding: utf-8 -*-

from pynput import keyboard

is_active = False
is_f11_pressed = False

def on_press(key):
    global is_f11_pressed
    global is_active
    # Activate/Deactivate when pressing F11
    if key == keyboard.Key.f11 and not is_f11_pressed:
        is_f11_pressed = True
        if is_active:
            is_active = False
            print("Deactivate...")
        else:
            is_active = True
            print("Activate...")
    # Stop "on_press" listener
    if key == keyboard.Key.f12:
        return False

def on_release(key):
    global is_f11_pressed
    if key == keyboard.Key.f11:
        is_f11_pressed = False

with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()

【讨论】:

以上是关于如何避免“on_press”监听事件循环?的主要内容,如果未能解决你的问题,请参考以下文章

一个事件监听器循环元素VS单个元素上的事件监听器?

如何获得一个循环来加载带有事件监听器的影片剪辑

如何更改哪个组件正在监听事件

jq 循环添加监听事件遇到的坑

UI事件监听的击穿

关于AngularJs中监听事件及脏循环的理解