python - 用一种方法监听 2 个不同的击键 (Pynput)

标签 python loops pynput

本质上,我的程序监听击键,如果它看到“向上”箭头被按下,它就会开始使用依赖“flag”为真的 while 循环打印单词 test。我希望程序在按下向下键时停止,但我无法做到这一点。我没有收到任何错误,它只是不会停止。

这是代码:

from pynput.keyboard import Key, Listener

flag = False

def doit():
    while flag:
        print("test")


def released(key):
    global flag
    if key == Key.up:
        flag = True
        doit()
    elif key == Key.down:
        print("stopped")
        flag = False


with Listener(on_release=released) as listener:
    listener.join()

当我按下向下箭头时,“stopped”不会被打印,所以看起来 if 语句根本没有被使用。我该如何解决这个问题?

最佳答案

您尝试同时做两件事:

  1. 监听键盘输入
  2. doit() 应该做的事情。

以下程序在单独的线程上启动 doit() ,从而允许主线程继续监听击键。

from pynput.keyboard import Key, Listener
from threading import Thread
import time

flag = False
thread = None

def doit():
    while flag:
        print("test")
        time.sleep(0.5)

def released(key):
    global flag, thread
    if key == Key.up:
        flag = True
        thread = Thread(target = doit)
        thread.start()
    elif key == Key.down:
        print("stopped")
        flag = False
        if thread.is_alive():
            thread.join()


with Listener(on_release=released) as listener:
    listener.join()

thread.start() 不会像 doit() 那样阻止执行。仅当调用thread.join()时,主线程才会阻塞,直到线程完成。请注意,这取决于主线程设置 flag = False,否则线程可能会无限继续,因此主线程在调用 thread.join() 时将永远等待。 当进入多线程世界时,会出现许多此类问题。

关于python - 用一种方法监听 2 个不同的击键 (Pynput),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54311950/

相关文章:

python - 如何从使用python从openCV获得的颜色检测结果区域获取屏幕坐标?

python - 在运算符中, float ("NaN")和 np.nan

python - Pandas 非常简单 分组总大小的百分比

python-3.x - 如何在不需要启动终端窗口的情况下等到在 python3 中按下热键?

javascript - 如何在javascript中通过两个对象创建新对象

python - 迭代使用自己输出的数组的最佳方法

python-3.x - Python 多线程与 pynput.keyboard.listener

python - 以 5 分钟的间隔将一个 DataFrame 复制到另一个

python - 如何在 tensorflow 中将图像张量转换为numpy数组?

java - 为什么我的数组搜索在搜索循环超过 2000 次后花费了 0 纳秒?