gpt4 book ai didi

python - 使用 pynput 监听特定按键

转载 作者:行者123 更新时间:2023-12-01 07:29:47 29 4
gpt4 key购买 nike

我希望我的代码能够监听用户输入,并在按下 c 键时执行某些操作,如果按下 v 键则执行其他操作。

我已经成功地使用global做到了这一点,但感觉就像一个丑陋的黑客:

from pynput import keyboard

def on_press(key):
try:
global user_input
if key.char == "c":
user_input = "c"
elif key.char == "v":
user_input == "v"
except AttributeError:
pass

def on_release(key):
if key == keyboard.Key.esc:
# Stop listener
return False

def wait_for_user_input():
global user_input
listener = keyboard.Listener(on_press=on_press, on_release=on_release)
listener.start()
user_input = 0
while user_input == 0:
time.sleep(0.5)
if user_input == "c":
# do something
listener.stop()
break
elif user_input == "v":
# do something else
listener.stop()
break
# other stuff

wait_for_user_input()

有更好的方法吗? (也许通过让监听器停止并在 on_press() 中返回值 cv ?如果是这样,我找不到如何做吧。)

另外:由于 wait_for_user_input() 将被多次调用,因此最好不要重复启动和停止监听器,而是让它启动一次并停止一次?

最佳答案

您可以将函数直接放在 on_press 中,然后就不需要 while 循环。您可能只需要 listener.join() 它将等待 listener.stop()

from pynput import keyboard

def on_press(key):
try:
if key.char == "c":
# do something
return False # Stop listener
elif key.char == "v":
# do something else
return False # Stop listener
except AttributeError as ex:
print(ex)

def on_release(key):
if key == keyboard.Key.esc:
# Stop listener
return False

def wait_for_user_input():
listener = keyboard.Listener(on_press=on_press, on_release=on_release)
listener.start()
listener.join() # wait till listener will stop
# other stuff
<小时/>

编辑:

如果您需要运行函数而导致需要其他函数,那么您可以继续使用global user_input,但您可以编写稍有不同的代码。

from pynput import keyboard

def on_press(key):
global user_input

try:
if key.char in ("c", "v"):
user_input = key.char
return False # Stop listener
except AttributeError as ex:
print(ex)

def on_release(key):
if key == keyboard.Key.esc:
return False # Stop listener

def wait_for_user_input():
listener = keyboard.Listener(on_press=on_press, on_release=on_release)
listener.start()
listener.join() # wait till listener will stop

if user_input == "c":
# do something
elif user_input == "v":
# do something else
else:
print('You pressed ESC ?')
<小时/>

编辑:如果您使用Windows,那么您可以使用msvcrt.getch,它可以提供更短、更好的代码。

from msvcrt import getch

def wait_for_user_input():

while True:
user_input = getch()
if user_input == "c":
print('selected: c')
break
elif user_input == "v":
print('selected: v')
break
elif user_input == escape:
print('You pressed ESC ?')
break

wait_for_user_input()

对于 Linux 应该是类似的函数 getch() 但代码更长。

另请参见模块 getch但我没有检查。

关于python - 使用 pynput 监听特定按键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57262917/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com