Спершу хочу сказати, що я знаю, що з прокляттями є рішення.
Моя програма - це цикл, який запускається кожендругий. Кожну секунду я хочу отримати останню клавішу, яка була або натиснута. Отже, якщо ви натискаєте клавішу, коли цикл спить, я хочу, щоб ключ був збережений, щоб я міг отримати ключ, який був натиснутий останнім, навіть коли його більше не натискати. Я не хочу, щоб збережений ключ був "видалений" після його отримання. Тому коли користувач натискав клавішу "a", я хочу отримувати її щосекунди, поки він не натиснув іншу клавішу. Якщо була натиснута певна клавіша, я хочу надрукувати текст. Цей текст я хочу написати у файл, використовуючи перенаправлення stdout:
./test.py > file.txt
Моя програма python, вирішена прокльонами, виглядає приблизно так:
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", і після того, як програма зупиниться, файл.txt виглядає приблизно так:
^[[?1049h^[[1;30r^[(B^[[m^[[4l^[[?7h^[[H^[[2Jtest
^[[30;1H^[[?1049l^M^[[?1l^[>
Але це має виглядати так:
test
Я був би дуже великим, якби хтось написав відповідь. Я знаю, що python не найкращий вибір для програм, що використовують події клавіш. Але у мене є причини, чому я використовую python для цього.
Заздалегідь дякую за відповіді.
Відповіді:
2 для відповіді № 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
. Це не зовсім зрозуміло з вашого запитання)