Detect external keyboard events in PyQt5(在 PyQt5 中检测外部键盘事件)
问题描述
如何在 PyQT5 中实现关键监听器?即使应用在后台,我也想检测按键.
How can I implement a key listener in PyQT5? I want to detect keypresses even when the app is in background.
from PyQt5 import QtGui
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
import sys
class 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())
推荐答案
Qt 只有在其顶层窗口有键盘焦点时才能访问键盘事件.如果窗口被最小化或另一个窗口获得焦点,您将不会收到键盘事件.
Qt can access keyboard events only if any of its top level window has keyboard focus. If the window is minimized or another window takes focus, you will not receive keyboard events.
唯一的解决方案是使用外部库,但它们有局限性.
The only solution is to use an external library, but they have limitations.
keyboard 模块似乎不支持 macOS,而 pyinput 可以,但需要该操作系统的 root 访问权限.我不知道有任何其他方法可以不受限制地支持所有三个平台.
The keyboard module does not seem to support macOS, while pyinput does, but requires root access for that OS. I don't know of any other ways that support all three platforms without limitations.
在任何情况下,您都不应该依赖于对当前按键的定时检查,因为您最终肯定会错过一些事件.
虽然通常会使用一个单独的线程来实现事件侦听器(通常是阻塞的),但幸运的是在这两种情况下都有非阻塞系统来调用回调函数(因此您实际上不需要单独的线程).
In any case, you should not rely on timed checking of the currently pressed keys, because you'll certainly end up missing some events.
While normally one would use a separate thread that implements the event listener (which are normally blocking), luckily in both cases there are non blocking systems to call callback functions (so you don't actually need a separate thread).
以下是使用 keyboard
模块的基本示例:
The following is a basic example using the keyboard
module:
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)
这篇关于在 PyQt5 中检测外部键盘事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:在 PyQt5 中检测外部键盘事件
基础教程推荐
- Python kivy 入口点 inflateRest2 无法定位 libpng16-16.dll 2022-01-01
- 如何让 python 脚本监听来自另一个脚本的输入 2022-01-01
- 筛选NumPy数组 2022-01-01
- 何时使用 os.name、sys.platform 或 platform.system? 2022-01-01
- 用于分类数据的跳跃记号标签 2022-01-01
- 使用PyInstaller后在Windows中打开可执行文件时出错 2022-01-01
- 如何在海运重新绘制中自定义标题和y标签 2022-01-01
- 在 Python 中,如果我在一个“with"中返回.块,文件还会关闭吗? 2022-01-01
- Dask.array.套用_沿_轴:由于额外的元素([1]),使用dask.array的每一行作为另一个函数的输入失败 2022-01-01
- 线程时出现 msgbox 错误,GUI 块 2022-01-01