Я придумал приключение создания относительно небольшой RPG командной строки, чтобы сгибать мои новоявленные мышцы Питона, но я уже столкнулся с головоломкой. Я использую эту реализацию Геч():Можно ли использовать getch() для получения входов переменной длины?
def getch():
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
tty.setraw(sys.stdin.fileno())
key = sys.stdin.read(3)
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
У меня есть key
набор для чтения в 3-х символов для захвата клавиш со стрелками. Up, например, считывается как ESC[A
; с помощью этого метода я могу использовать key[2]
, чтобы определить, была ли нажата клавиша со стрелкой и какая. Все хорошо и хорошо, за исключением того, что я также хотел бы захватить всевозможные другие ключи; q
для журнала квестов, wasd
для перемещения (нажатие стрелок в разных порядках будет методом атаки) и многие другие. Проблема мгновенно понятна; если getch()
возвращает только один символ, функциональность стрелки полностью теряется.
Я рассматриваю переосмысление системы стрельбы вообще, если нет простого решения, но я почти уверен, что должно быть. По общему признанию, я мало знаю о том, что происходит в пределах tty
, но я где-то читал, что если вы читаете только 1 символ, избыточные символы из стрелки сохраняются в буфере. Как я могу получить доступ к указанному буферу? Альтернативно, есть ли какой-нибудь умный способ сообщить stdin
, чтобы ожидать ввода переменной длины?
Заранее благодарю за любую помощь.
Это потребует, чтобы пользователь дважды нажал клавишу со стрелкой, что не очень дружелюбно. –
нет нет. вы заменяете 'read (3)' на 'read (1)', за которым следует инструкция if, ища '\ x1b', а затем' read (2) ', чтобы увидеть, какой ключ был нажат. – SingleNegationElimination
Ах, да. Делает совершенный смысл. Спасибо, токен. –