Почему 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 . Почему так?
QKeyEvent не работает без окна, потому что QKeyEvent является событием, связанным с виджетом. Без окна или виджета QKeyEvent не будет генерироваться.
В вашем втором примере, вы пытаетесь использовать keyPressEvent вне класса, что не будет работать. Метод keyPressEvent должен быть внутри класса виджета, чтобы он мог обрабатывать события нажатия клавиш.
Касательно вашего вопроса о том, почему срабатывает условие if event.key() == Qt.Key_0 or Qt.Key_1 при нажатии любой клавиши, это связано с тем, что условие написано некорректно. Корректный способ сравнения значения ключа должен быть таким:
if event.key() == Qt.Key_0 or event.key() == Qt.Key_1:
В этом случае условие сработает только при нажатии клавиши Key_0 или Key_1.
QKeyEvent не работает без окна, потому что QKeyEvent является событием, связанным с виджетом. Без окна или виджета QKeyEvent не будет генерироваться.
В вашем втором примере, вы пытаетесь использовать keyPressEvent вне класса, что не будет работать. Метод keyPressEvent должен быть внутри класса виджета, чтобы он мог обрабатывать события нажатия клавиш.
Касательно вашего вопроса о том, почему срабатывает условие if event.key() == Qt.Key_0 or Qt.Key_1 при нажатии любой клавиши, это связано с тем, что условие написано некорректно. Корректный способ сравнения значения ключа должен быть таким:
if event.key() == Qt.Key_0 or event.key() == Qt.Key_1:В этом случае условие сработает только при нажатии клавиши Key_0 или Key_1.