在一种方法中监听 2 个不同的击键 (Pynput)
Listen For 2 Different Keystrokes in One Method (Pynput)
基本上我的程序会监听击键,如果它看到 "up" 箭头被按下,它就会开始使用依赖于 "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 语句。我该如何解决这个问题?
您正在尝试同时做两件事:
- 监听键盘输入
- 做
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()
时将永远等待。
进入多线程世界时会出现许多此类问题。
基本上我的程序会监听击键,如果它看到 "up" 箭头被按下,它就会开始使用依赖于 "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 语句。我该如何解决这个问题?
您正在尝试同时做两件事:
- 监听键盘输入
- 做
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()
时将永远等待。
进入多线程世界时会出现许多此类问题。