/ / Como obter a última chave pressionada em python? - python, keyevent

Como obter a última tecla pressionada em python? - python, keyevent

Primeiro quero dizer que sei que existe uma solução com maldições.
Meu programa é um loop while que é executado a cadasegundo. Cada segundo eu quero pegar a última chave que foi ou está pressionada. Então, caso você pressione uma tecla enquanto o loop dorme, eu quero que a chave seja salva para que eu possa pegar a tecla que foi pressionada por último, mesmo quando ela não estiver mais pressionada. Eu não quero que a chave salva seja "excluída" depois de obtida. Então, quando o usuário pressionou a tecla "a", quero obtê-lo a cada segundo até que ele pressionou outra tecla. Se uma tecla específica foi pressionada, quero imprimir o texto. Este texto eu quero escrever em um arquivo usando o redirecionamento de stdout:

 ./test.py > file.txt

Meu programa de python resolvido com curses se parece com isso:

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 problema dessa solução é que maldições me dão uma saída maluca. Eu só pressiono uma vez a tecla "o" e depois do programa parado file.txt fica assim:

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

Mas deve ficar assim:

test

Eu ficaria muito grato se alguém escrevesse uma resposta. Eu sei que o python não é a melhor escolha para programas usando eventos keypress. Mas eu tenho razões pelas quais eu uso python para isso.

Muito obrigado antecipadamente por suas respostas.

Respostas:

2 para resposta № 1

Você pode instalar e usar o getch pacote.

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

(você pode precisar usar getch.getche ao invés de getch.getch. Não está completamente claro da sua pergunta)