无法检测 Shift 和 Ctrl 键的状态
Can't detect state of Shift and Ctrl keys
我编写了一个简单的 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 window 具有焦点时才检测按下的键。如果你想检测这些键是否被按下,即使 Qt window 没有焦点,那么你将不得不使用 OS 中的库或 pynput, keyboard[=12 这样的库=]
我编写了一个简单的 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 window 具有焦点时才检测按下的键。如果你想检测这些键是否被按下,即使 Qt window 没有焦点,那么你将不得不使用 OS 中的库或 pynput, keyboard[=12 这样的库=]