Как получить последнюю клавишу нажатой в Python?

Сначала я хочу сказать, что я знаю, что есть решение с проклятиями.
Моя программа представляет собой цикл while, который запускается каждую секунду. Каждую секунду я хочу получить последнюю клавишу, которая была или была нажата. Поэтому, если вы нажимаете клавишу во время спящего цикла, я хочу, чтобы она была сохранена, чтобы я мог получить клавишу, которая была нажата последней, даже если она больше не нажата. Я не хочу, чтобы сохраненный ключ был "удален" после его получения. Поэтому, когда пользователь нажимает клавишу "а", я хочу получать его каждую секунду, пока он не нажмет другую клавишу. Если была нажата определенная клавиша, я хочу напечатать текст. Этот текст я хочу записать в файл, используя перенаправление stdout:

 ./test.py > file.txt

Моя Python-программа, решенная с помощью curses, выглядит так:

import curses
from time import sleep

stdscr=curses.initscr()
stdscr.nodelay(1)
curses.noecho()
curses.cbreak()

while True:
    char=stdscr.getch()
    if char == 111:        #111 = "o" key
        print("test")
        break
    elif char == 97        #97 = "a" key

        #code that have to be run every second
        #if the a key is the last pressed key!

    sleep(1)

curses.nocbreak()
curses.echo()
curses.endwin()

Проблема этого решения в том, что проклятия дают мне сумасшедший результат. Я нажимаю только один раз клавишу "o" и после остановки программы file.txt выглядит так:

^[[?1049h^[[1;30r^[(B^[[m^[[4l^[[?7h^[[H^[[2Jtest
^[[30;1H^[[?1049l^M^[[?1l^[>

Но это должно выглядеть так:

test

Я был бы очень признателен, если бы кто-то написал ответ. Я знаю, что python не лучший выбор для программ, использующих события нажатия клавиш. Но у меня есть причины, почему я использую Python для этого.

Заранее большое спасибо за ваши ответы.

1 ответ

Вы можете установить и использовать getch пакет.

import getch
from time import sleep
while True:
    char = getch.getch()
    if char == 111:
        print("test")
        break
    sleep(1)

(вам может понадобиться getch.getche вместо getch.getch, Это не совсем понятно из твоего вопроса)

Другие вопросы по тегам