本质上,我的程序侦听击键,如果看到按下了“向上”箭头,它将开始使用依赖于“ 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语句。我怎样才能解决这个问题?
最佳答案
您正在尝试同时做两件事:
监听键盘输入
做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/