问题描述
我编写了一个简单的PyQt5应用程序,它尝试检测Shift和Ctrl键的状态,每隔一秒检查一次。出于我不了解的原因,该代码始终报告未按任何键,无论实际的键盘状态如何。
import time
from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication,QWidget
class App(QWidget):
def __init__(self):
super().__init__()
self.setGeometry(10,30,10,10)
self.show()
while True:
modifiers= QApplication.keyboardModifiers()
if modifiers == QtCore.Qt.ShiftModifier:
print("Shift key is down; Ctrl key is up.")
elif modifiers == QtCore.Qt.ControlModifier:
print("Shift key is up; Ctrl key is down")
elif modifiers == (QtCore.Qt.ControlModifier | QtCore.Qt.ShiftModifier):
print("Shift and Ctrl keys are both down.")
else:
print("Neither Shift nor Ctrl is down.")
time.sleep(1)
# end def __init__
if __name__ == '__main__':
import sys
app= QApplication(sys.argv)
ex = App()
sys.exit(app.exec_())
解决方法
从不在主线程中使用time.sleep,因为它会阻塞事件循环,如果您要执行定期任务,请使用QTimer:
from PyQt5.QtCore import Qt,QTimer
from PyQt5.QtWidgets import QApplication,QWidget
class App(QWidget):
def __init__(self):
super().__init__()
self.setGeometry(10,30,10,10)
self.show()
timer = QTimer(self,interval=1000,timeout=self.detect)
timer.start()
def detect(self):
modifiers = QApplication.keyboardModifiers()
if modifiers == Qt.ShiftModifier:
print("Shift key is down; Ctrl key is up.")
elif modifiers == Qt.ControlModifier:
print("Shift key is up; Ctrl key is down")
elif modifiers == (Qt.ControlModifier | Qt.ShiftModifier):
print("Shift and Ctrl keys are both down.")
else:
print("Neither Shift nor Ctrl is down.")
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
ex = App()
sys.exit(app.exec_())
注意:您必须记住,只有在Qt窗口具有焦点时,Qt才会检测到按下的键。如果即使在Qt窗口没有焦点时也要检测是否按下了这些键,则必须使用操作系统中的库或类似pynput,keyboard
的库