一种方法聆听2种不同的击键(算术)

时间:2019-01-22 15:52:38

标签: python loops pynput

基本上,我的程序监听按键,并且如果看到按下了“向上”箭头,它将开始使用依赖于“ flag”为true的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 个答案:

答案 0 :(得分:1)

您正在尝试同时做两件事:

  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()时,主线程将永远等待。 进入多线程世界时,会出现许多这类问题。