1 回答

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)
添加回答
舉報