为了账号安全,请及时绑定邮箱和手机立即绑定

在 PyQt5 中检测外部键盘事件

在 PyQt5 中检测外部键盘事件

慕标5832272 2023-04-18 15:47:34
如何在 PyQT5 中实现关键监听器?即使应用程序处于后台,我也想检测按键。from PyQt5 import QtGuifrom PyQt5.QtWidgets import *from PyQt5.QtCore import Qtimport sysclass Window(QWidget):        ...           def keyPressEvent(self, e): # doesnt work when app is in background        if e.key() == Qt.Key_F3:            print(1)        elif e.key() == Qt.Key_F4:            print(0)   ...        App = QApplication(sys.argv)App.setStyle('Fusion')window = Window()sys.exit(App.exec())
查看完整描述

1 回答

?
MM们

TA贡献1886条经验 获得超2个赞

仅当其任何顶级窗口具有键盘焦点时,Qt 才能访问键盘事件。如果窗口最小化或另一个窗口获得焦点,您将不会收到键盘事件。

唯一的解决方案是使用外部库,但它们有局限性。

键盘模块似乎不支持 macOS,而pyinput支持,但需要该操作系统的根访问权限。我不知道有任何其他方式可以无限制地支持所有三个平台。

在任何情况下,您都不应该依赖于对当前按下的键的定时检查,因为您最终肯定会错过一些事件。
虽然通常人们会使用一个单独的线程来实现事件侦听器(通常是阻塞的),但幸运的是,在这两种情况下都有非阻塞系统来调用回调函数(因此您实际上不需要单独的线程)。

以下是使用该keyboard模块的基本示例:

from PyQt5 import QtCore, QtWidgets

import keyboard


class KeyGrabber(QtWidgets.QWidget):

    def __init__(self):

        super().__init__()

        layout = QtWidgets.QVBoxLayout(self)

        self.button = QtWidgets.QPushButton('start')

        layout.addWidget(self.button)

        self.button.setCheckable(True)

        self.button.toggled.connect(self.setGrabbing)


    def keyboardEventReceived(self, event):

        if event.event_type == 'down':

            if event.name == 'f3':

                print('F3 pressed')

            elif event.name == 'f4':

                print('F4 pressed')


    def setGrabbing(self, enable):

        if enable:

            self.button.setText('stop')

            # on_press returns a hook that can be used to "disconnect" the callback

            # function later, if required

            self.hook = keyboard.on_press(self.keyboardEventReceived)

            self.showMinimized()

        else:

            self.button.setText('start')

            keyboard.unhook(self.hook)


查看完整回答
反对 回复 2023-04-18
  • 1 回答
  • 0 关注
  • 232 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信