@bychok300

Почему QKeyEvent не работает без окна?

Eсли я добавляю йункцию отлавливающую нажатие кнопки на клавиатуре:
def keyPressEvent(self, event):
        if type(event) == QKeyEvent:
            if event.key() == Qt.Key_0 or Qt.Key_1:
                print('Key was pressed')

В этот кусок кода :
def distance(x1, y1, x2, y2):
return math.sqrt((x2 - x1)**2 + (y2 - y1)**2)

class Frame:
    def __init__(self, position, time):
        self.position = position
        self.time = time

    def speed(self, frame):
        d = distance(*self.position, *frame.position)
        time_delta = abs(frame.time - self.time)
        return d / time_delta

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.last_frame = None
        self.setMouseTracking(True)

    def mouseMoveEvent(self, event):

        nowTime = datetime.now()
        mouseWasMoveAt = nowTime.strftime('%H:%M:%S')

        new_frame = Frame((event.x(), event.y()), time.time())

        if self.last_frame:
            print(new_frame.speed(self.last_frame), mouseWasMoveAt ) #print speed and time

        self.last_frame = new_frame

    def keyPressEvent(self, event):
        if type(event) == QKeyEvent:
            if event.key() == Qt.Key_0 or Qt.Key_1:
                print('Key was pressed')    

if __name__ == '__main__':
    app = QApplication(sys.argv)

    w = MainWindow()
    w.resize(900,600)
    w.show()

    app.exec_()

Все работает хорошо, выводится все что я хочу, но если я хочу то же самое, но без создания окошка, то ничего не работает, ниже код без окна:
class Frame:
    def __init__(self, position, time):
        self.position = position
        self.time = time


    def speed(self, frame):
        d = distance(*self.position, *frame.position)
        time_delta = abs(frame.time - self.time)
        return d / time_delta

    def keyPressEvent(self, event):
        if type(event) == QKeyEvent:
            if event.key() == Qt.Key_0 or Qt.Key_1:
                print('Key was pressed')

def distance(x1, y1, x2, y2):
    return math.sqrt((x2 - x1)**2 + (y2-y1)**2)

def get_current_cursor_position():
    pos = QCursor.pos()
    return pos.x(), pos.y()

def get_current_frame():
    return Frame(get_current_cursor_position(), time.time())



if __name__ == '__main__':

    app = QApplication(sys.argv)

    last_frame = get_current_frame()


    while True:
        nowTime = datetime.now()
        mouseWasMoveAt = nowTime.strftime('%Y-%m-%d %H:%M:%S')

        new_frame = get_current_frame()

        if new_frame.speed(last_frame) != 0:

            print(mouseWasMoveAt)
            last_frame = new_frame
            time.sleep(0.07)

Вот, этот кусок кода не работает, как это можно поправить, может я вообще все нитак сделал? И второй вопрос: если я пишу отслеживание нажатий так:
def keyPressEvent(self, event):
       if type(event) == QKeyEvent:
           if event.key() == Qt.Key_0 or Qt.Key_1:
               print('Key was pressed')

print() пишет мне любую клавишу какую бы я не нажал, если я меняю if event.key() == Qt.Key_0 print() напиште только Key_0 . Почему так?
  • Вопрос задан
  • 549 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Andy_U
Вот тут очевидная ошибка:

if event.key() == Qt.Key_0 or Qt.Key_1:

Должно быть так:

if event.key() in [Qt.Key_0, Qt.Key_1]:

Ну, или так:

key = event.key()
if key == Qt.Key_0 or key == Qt.Key_1:


А с frame, по крайней мере, в том виде, как Вы написали, ничего работать не будеть, ведь этот класс не отнаследован от QmainWindow etc.
Ответ написан
@Sergey6661313
События в pyqt могут получать только унаследованные от QObject обьекты. Потому что внутри их кода и кода в библиотеках qt есть код который "посылает" сообщения и вызывает в объектах метод keyPressEvent . Вы же создаёте новый класс Frame и не унаследуете для него никакие Qt-шные функции. Поэтому функция keyPressEvent не будет в нём вызвана никогда.
Это ответ на вопрос "почему"... а вот ответить как сделать правильно на Qt я не могу...

Однако могу посоветовать копать в сторону сторонней библиотеке keyboard которая в принципе может и без Qt:
import keyboard

while True:
    print(keyboard.is_pressed("space"))   # printed True or False
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы