Как убрать повторные (фантомные) нажатия на клавиатуру в PyQt5?
Мне требуется чтобы программа могла отслеживать долгие нажатия на клавиши клавиатуры и выполнять одну функцию при нажатии, а другую при отпускании клавиши, причём само нажатие может быть сколь угодно долгим.
Проблема в том, что спустя какое то время после нажатия клавиша начинает то нажиматься, то отпускаться(это выглядит так же как и при длительном нажатии в текстовом редакторе: жжжжжжжжжжжжжжжжжжжжжжжжж).
При этом поочерёдно вызывает методы keyPressEvent() и keyReleaseEvent() и отследить момент отпуска клавиши становится невозможно.
Вот пример кода который я использовал(очень сжатый):
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(300, 300, 300, 300)
self.setWindowTitle('прога')
def keyPressEvent(self, event):
print('нажато', chr(event.key()))
def keyReleaseEvent(self, event):
print('отжато', chr(event.key()))
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec())
И вывод при зажатии ОДНОЙ клавиши(Примерно на секунду):
нажато A
отжато A
нажато A
отжато A
нажато A
отжато A
нажато A
отжато A
...
нажато A
отжато A
Очень желательно обойтись без существенных изменений кода и посредством PyQt5, а так буду рад любому решению или предположению!
Вероятнее всего проблема возникает от самой клавиатуры, а не от кода, и возможно есть какие либо способы убрать этот режим из самой клавы (в настройках винды такого нет, я смотрел). Например подключить какую-нибудь библиотеку, позволяющую напрямую влиять на клаву, и там уже прописать этот режим. так будет лучше всего.
Ответы (1 шт):
bool QKeyEvent::isAutoRepeat() const
Возвращает
True, если это событие происходит от автоматически повторяющегося ключа; возвращаетFalse, если это происходит при первом нажатии клавиши.Обратите внимание, что если событие представляет собой сжатое событие с
несколькимиклавишами, которое частично связано с автоповтором, эта функция может возвращать либоTrue, либоFalseнеопределенно.
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(300, 300, 300, 300)
self.setWindowTitle('прога')
def keyPressEvent(self, event):
print('>>> нажато', chr(event.key()))
super().keyPressEvent(event)
def keyReleaseEvent(self, event):
if not event.isAutoRepeat():
print(' отжато <<<<<<', chr(event.key()))
super().keyReleaseEvent(event)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec_())
