如何使用Python检测按键释放事件(而不是按下事件)?

3

如何使用Python 3检测按键释放?

例如,如果我按下键盘上的 a 键一秒钟,当我松开手指时,它将会 print("Key 'a' pressed then released")

我尝试使用模块keyboard来实现,但我不知道如何使用它来完成这项任务。我之前用它来检测按键按下。
msvcrt模块对我无效,但如果msvcrt能够实现我想要的功能,那么你可以回答我。

注意:

我不想使用Pygame或任何其他会显示弹出窗口的模块


1
请跟随您提供的链接:this? - undefined
2
你的模块里面确实包含了一个例子,它可以完成你所要求的功能:https://github.com/boppreh/keyboard/blob/master/examples/pressed_keys.py - undefined
3个回答

7
您可以使用pynput模块:
from pynput import keyboard

def on_key_release(key):
    print('Released Key %s' % key)

with keyboard.Listener(on_release = on_key_release) as listener:
    listener.join()

根据pynput文档,键盘监听器是一个线程,它使用key参数调用在on_release上指定的函数。您还可以指定on_press函数。

编辑:

如讨论中所要求的,您可以通过从on_key_release函数返回false来停止监听器。像这样:

def on_key_release(key):
    print('Released Key %s' % key)
    return False

很好,但请让它更易懂一些。 - undefined
pynput可以全局捕获事件,即使焦点不在您的应用程序窗口中,这使得它不适合在应用程序中实现键盘控制。请参阅https://stackoverflow.com/questions/47532462/pynput-reject-input-when-terminal-not-focused - undefined

5
您可以使用tkinter进行操作:
from tkinter import *
def keyup(e):
    print('up', e.char)
def keydown(e):
    print('down', e.char)

root = Tk()
frame = Frame(root, width=100, height=100)
frame.bind("<KeyPress>", keydown)
frame.bind("<KeyRelease>", keyup)
frame.pack()
frame.focus_set()
root.mainloop()

3
请再次阅读我的评论。 - undefined
哦,我猜还可以有其他方式来实现,不需要弹出窗口。我知道这种方式,也许还有其他人知道其他的方式... - undefined

0
与Acafed的回答类似,假设你使用的是python3并且使用tkinter,你可以很容易地按照以下方式实现:
from tkinter import Tk,Frame #importing only necessary stuff.

def keyrelease(e):
    print('The key was released: ', repr(e.char))

root = Tk()
f = Frame(root, width=100, height=100)
f.bind("<KeyRelease>", keyrelease)
f.pack()
root.mainloop()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接