Как убрать повторные (фантомные) нажатия на клавиатуру в 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 шт):

Автор решения: S. Nick

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_())

введите сюда описание изображения

→ Ссылка