1 回答

TA貢獻(xiàn)1886條經(jīng)驗(yàn) 獲得超2個(gè)贊
僅當(dāng)其任何頂級(jí)窗口具有鍵盤(pán)焦點(diǎn)時(shí),Qt 才能訪問(wèn)鍵盤(pán)事件。如果窗口最小化或另一個(gè)窗口獲得焦點(diǎn),您將不會(huì)收到鍵盤(pán)事件。
唯一的解決方案是使用外部庫(kù),但它們有局限性。
鍵盤(pán)模塊似乎不支持 macOS,而pyinput支持,但需要該操作系統(tǒng)的根訪問(wèn)權(quán)限。我不知道有任何其他方式可以無(wú)限制地支持所有三個(gè)平臺(tái)。
在任何情況下,您都不應(yīng)該依賴于對(duì)當(dāng)前按下的鍵的定時(shí)檢查,因?yàn)槟罱K肯定會(huì)錯(cuò)過(guò)一些事件。
雖然通常人們會(huì)使用一個(gè)單獨(dú)的線程來(lái)實(shí)現(xiàn)事件偵聽(tīng)器(通常是阻塞的),但幸運(yùn)的是,在這兩種情況下都有非阻塞系統(tǒng)來(lái)調(diào)用回調(diào)函數(shù)(因此您實(shí)際上不需要單獨(dú)的線程)。
以下是使用該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)
添加回答
舉報(bào)