python - 如何避免“on_press”监听事件循环?
问题描述
我正在编写一段非常简单的代码。
- 我想听键盘。
- 当我按 F11 时,必须显示消息“已激活...”,仅显示一次。
- 当我再次按 F11 时,必须显示消息“已停用...”,而且只显示一次。
- 等等...
- 当我按 F12 时,我希望听众停止。
这是我的一段代码,当我按下 F11 时,我很难找到正确的实现来避免不断循环(“激活...停用...激活...停用...”)。
此外,欢迎任何关于实现更好、更先进、更 Python 的建议!
# -*- 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()
解决方案
你会想要使用
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()
推荐阅读
- python - Pypy 上的多处理是线程的,但仅在 1 个核心上
- angular - 如何在本地存储中正确设置数据?
- python - Python:循环时更新字典中的值
- python - 如何从第二个位置带有“i”的列表中找到单词?[Python]
- pytest - Pytest,根据白名单验证文件列表
- css - 使用 Elementor 格式化文本编辑器
- neutralinojs - NeutralinoJS:错误:缺少必需的参数“名称”
- r - R 比较 (1) 仅适用于原子和列表类型
- html - bootstrap 5 网格布局 col-md-6 无法正常工作
- java - 码头 Websocket API 会话