0

我正在尝试使用此代码(Python 3.7)获取按下哪个键,按下哪个键,释放哪个键以及何时释放它;

from tkinter import *
import datetime

gui = Tk()
gui.geometry("500x200+400+400")
gui.resizable(0, 0)
gui.title("Key Press & Release Control On Raspberr Pi")

def end_app(*args):
    gui.destroy()

def key_press_control(event):
    print("Pressed Key  :  -" + event.keysym + "- ", datetime.datetime.now())
    
def key_release_control(event):
    print(50*" " + "Released Key :  -" + event.keysym + "- ", datetime.datetime.now())

gui.bind("<Escape>", end_app)
gui.bind("<KeyPress>",  key_press_control)
gui.bind("<KeyRelease>", key_release_control)

gui.mainloop()

当我在 Raspberry Pi 上运行此代码并按下“r”键近一秒钟时,我得到了这个结果;

在此处输入图像描述

当我在 Windows 上运行此代码并按下“w”键近一秒钟时,我得到了这个结果;

在此处输入图像描述

无论按下多长时间,通常我都需要获取按下哪个键,按下一次的信息以及释放哪个键以及释放一次的信息。

但是正如您在这些图片中看到的那样,在 Windows 操作系统上,按键事件发生了多次,但释放事件仅发生了一次(更好的情况是,我无论如何都可以控制它以运行我的其他控制脚本)。

但是在 Raspberry Pi(Linux raspberrypi 5.10.63-v7+ #1488 SMP Thu Nov 18 16:14:44 GMT 2021 armv7l GNU/Linux)上,按键按下和释放事件接连发生多次,尽管您的手指仍然在按键上. 在这种情况下,我无法控制我的其他脚本,因为系统检测到该键被连续按下和释放。

我是先尝试使用 Python 原生库和命令,所以没有尝试其他键盘控制库。它必须以某种方式工作,它不能像这样有问题。

我错过了什么?

--------- 7 小时后 ------------

我发现 Raspberry Pi 上的这个问题与 VNC 连接有关。当您将键盘直接连接到 Raspberry Pi 时,它会像 Windows 一样做出反应,因此不会出现任何问题。但是当您使用 VNC 并远程连接到 Raspberr Pi 时,键盘事件的工作方式会有所不同。

我也尝试了 pynput 库,它在 VNC 上的工作方式相同,所以问题没有解决。

现在,我需要找到一种适用于 VNC 远程连接的好方法(VNC 配置来解决问题)或库。

-------- 1 小时后 ------------

直接把你的键盘连接到树莓派上,使用pynput库,按键和按键释放检测和Windows一样,可以说正常,但它应该测试更多时间,我尝试了1-5 sc。

如果你使用 Python 原生的 keypress 和 release 事件,在你按下 1 sc 之后它们仍然有同样的问题。到一个键,它会检测到一次按下和一次释放 :( 尚未解决。

---------- 1天后--------我找到了解决方法。我保留最后一次密钥释放事件的时间,如果在约 200 毫秒后没有发生新的密钥释放事件,则表示该密钥已真正释放。现在我可以通过 VNC 在 Raspberry Pi 上正常控制我的脚本了。

4

0 回答 0