【问题标题】:Listen For 2 Different Keystrokes in One Method (Pynput)用一种方法听 2 种不同的击键(Pynput)
【发布时间】:2019-06-16 03:22:33
【问题描述】:

基本上我的程序监听击键,如果它看到“向上”箭头被按下,它开始使用依赖于“标志”为真的 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()

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

【问题讨论】:

  • doit() 的调用永远不会返回,也永远不允许您检查Key.down 是否被按下。尝试在doit() 之后在线打印一些东西 - 它永远不会。许多应用程序既需要进行一些处理(如渲染),又需要允许用户输入。这通常通过将每个线程分开以在自己的线程上运行或在两者之间切换来完成。
  • 这个答案非常复杂。您在问如何使某些东西完全同步,完全异步。
  • 最好的方法是什么?

标签: python loops pynput


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

【讨论】:

  • 谢谢,效果很好。我很感激你的解释,我以前没有接触过多线程的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-15
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
  • 2012-07-18
相关资源
最近更新 更多